Выпадающие списки являются одним из наиболее частых элементов в веб-формах. В HTML вы можете создать такой элемент управления, используя соответствующие теги: <form: select> — родительский тег раскрывающегося списка и <form: option> — дочерний тег тега <form: select> . Библиотека тегов Spring MVC имеет собственное решение для выпадающих списков. В этом посте я напишу о тегах <form: select> , <form: option> и <form: options> . 
В предыдущих статьях об обработке форм с использованием Spring MVC я сделал обзор случаев, когда нам нужно связать текстовое поле, флажки или переключатели с помощью объекта Java. Почти все шаги будут повторяться для элемента выбора выпадающего списка . Далее я рассмотрю три ситуации с выпадающими списками в контексте связывания его с Java-объектом с использованием библиотеки тегов Spring MVC. Первый случай будет о форме: выберите тег со значениями, основанными на java.util.Map , второй пример будет об использовании формы: выберите тег в сочетании с тегами формы: опции , третий пример будет об использовании формы: выберите тег в сочетании с формой: параметры тега.
Каждый пример будет иметь одинаковый результат jsp-страницы, поэтому будут отличаться только страницы формы и контроллеры для них. Настройка конфигурации будет опущена, потому что это было объяснено в одной из предыдущих статей .
Spring MVC выберите тег
Предположим, что пользователь веб-приложения может выбрать производителя мобильного телефона (например, HTC, SAMSUNG, IPHONE и т. Д.). Мы можем реализовать это несколькими способами, используя библиотеку тегов Spring MVC.
Модель предметной области:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
public class Smartphone { private String phone; public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; }} |
Этот класс будет привязан к формам.
SmartphoneController:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
... @RequestMapping(value="/phone-page") private ModelAndView selectTag() { ModelAndView mav = new ModelAndView("phone-form"); Map< String, String > phones = new HashMap(); phones.put("samsung", "SAMSUNG"); phones.put("nokia", "NOKIA"); phones.put("iphone", "IPHONE"); mav.addObject("phonesMap", phones); mav.addObject("smartphone", new Smartphone()); return mav; } @RequestMapping(value="/phone-result") private ModelAndView processPhone(@ModelAttribute Smartphone smartphone) { ModelAndView mav = new ModelAndView("phone-result"); mav.addObject("smartphone", smartphone); return mav; }... |
В методе selectTag () я создаю Карту со значениями, которые будут отображаться на странице с выпадающим списком . Второй метод processPhone (смартфон смартфона @ModelAttribute) будет использоваться в качестве общей конечной точки для всех примеров.
JSP для этого примера:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
<h1>Phone page</h1>Select phone:<form:form method="POST" commandname="smartphone" action="phone-result.html"><table> <tbody><tr> <td> <ul> <form:select path="phone" items="${phonesMap}"> </form:select></ul> </td> </tr> <tr> <td> <input value="Submit" type="submit"> </td> </tr></tbody></table> </form:form> |
это оно
Spring MVC опция tag
Во втором примере будет использоваться жестко закодированное значение тега <form: option> .
контроллер:
|
1
2
3
4
5
6
|
... @RequestMapping(value="/phone-option-page") private ModelAndView optionTag() { return new ModelAndView("phone-option-form", "smartphone", new Smartphone()); }... |
Обратите внимание на JSP:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<h1>Phone page</h1>Select phone:<form:form method="POST" commandname="smartphone" action="phone-result.html"><table> <tbody><tr> <td> <ul> <form:select path="phone"> <form:option value="samsung">SAMSUNG</form:option> <form:option value="nokia">NOKIA</form:option> <form:option selected="selected" value="htc">HTC</form:option> <form:option value="iphone">IPHONE</form:option> </form:select> </ul> </td> </tr> <tr> <td> <input value="Submit" type="submit"> </td> </tr></tbody></table> </form:form> |
Тег настроек Spring MVC
Последний пример демонстрирует, как работает тег <form: options> .
контроллер:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
... @RequestMapping(value="/phone-options-page") private ModelAndView optionsTag() { ModelAndView mav = new ModelAndView("phone-options-form"); Map< String, String > phones = new HashMap(); phones.put("samsung", "SAMSUNG"); phones.put("nokia", "NOKIA"); phones.put("iphone", "IPHONE"); phones.put("bberry", "BLACKBERRY"); phones.put("htc", "HTC"); mav.addObject("phonesMap", phones); mav.addObject("smartphone", new Smartphone()); return mav; }... |
И соответствующий JSP:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
...<h1>Phone page</h1>Select phone:<form:form method="POST" commandname="smartphone" action="phone-result.html"><table> <tbody><tr> <td> <ul> <form:select path="phone"> <form:option value="-" label="--Select phone"> <form:options items="${phonesMap}"> </form:options></form:option></form:select> </ul> </td> </tr> <tr> <td> <input value="Submit" type="submit"> </td> </tr></tbody></table> </form:form>... |
Как указано в официальной документации Spring, вы можете использовать любые виды java-объектов с соответствующими методами получения и установки для формы: тег option: атрибут items обычно заполняется коллекцией или массивом объектов item. itemValue и itemLabel просто ссылаются на свойства bean-объектов этих объектов item, если они указаны; в противном случае сами объекты объекта будут зашифрованы. В качестве альтернативы вы можете указать карту элементов, и в этом случае ключи карты интерпретируются как значения параметров, а значения карты соответствуют меткам параметров. Если itemValue и / или itemLabel также указаны, свойство значения элемента будет применяться к ключу карты, а свойство метки элемента будет применяться к значению карты.
Резюме
Каждый из этих примеров удобен в конкретной ситуации и должен использоваться рационально. Тег <form: option> можно использовать в небольших проектах, где вам не нужно большое количество параметров, а <form: options> следует использовать при сохранении значений раскрывающегося списка в базе данных или при необходимо генерировать значения во время выполнения. Исходный код руководства вы можете найти на GitHub .
