Выпадающие списки являются одним из наиболее частых элементов в веб-формах. В 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 .