Перейти к основному содержимому

Работа с Select и Option в Thymeleaf

· 4 мин. чтения

1. Обзор

Thymeleaf — популярный движок шаблонов, поставляемый вместе с Spring Boot. Мы уже публиковали несколько статей об этом и настоятельно рекомендуем ознакомиться с серией ForEach’s Thymeleaf .

В этом руководстве мы рассмотрим, как работать с тегами select и option в Thymeleaf.

2. Основы HTML

В HTML мы можем создать раскрывающийся список с несколькими значениями:

<select>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
<option value="pear">Pear</option>
</select>

Каждый список состоит из тегов выбора и вложенных опций . По умолчанию веб-браузер отображает список с предварительно выбранным первым вариантом .

Мы можем контролировать, какое значение выбирается с помощью выбранного атрибута:

<option value="orange" selected>Orange</option>

Более того, мы можем указать, что параметр нельзя выбрать, используя атрибут disabled :

<option disabled>Please select...</option>

3. Лист тимьяна

В Thymeleaf мы можем использовать атрибут th:field для привязки представления к модели:

<select th:field="*{gender}">
<option th:value="'M'" th:text="Male"></option>
<option th:value="'F'" th:text="Female"></option>
</select>

Хотя приведенный выше пример не требует использования механизма шаблонов, в более сложных примерах мы увидим мощь Thymeleaf.

3.1. Вариант без выбора

Если мы подумаем о сценарии, в котором есть больше вариантов для выбора, то чистый и аккуратный способ отобразить их все — использовать атрибут th:each вместе с th:value и th:text :

<select th:field="*{percentage}">
<option th:each="i : ${#numbers.sequence(0, 100)}" th:value="${i}" th:text="${i}">
</option>
</select>

В приведенном выше примере мы используем последовательность чисел от 0 до 100. Мы присваиваем значение каждого числа i атрибуту value тега option и используем то же число в качестве отображаемого значения. ``

Код Thymeleaf будет отображаться в браузере как:

<select id="percentage" name="percentage">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
...
<option value="100">100</option>
</select>

Давайте представим этот пример как create , т. е. мы начинаем с новой формы, и процентное значение не нужно предварительно выбирать .

3.2. Выбранный вариант

Предположим, мы хотим расширить нашу форму с помощью функции обновления . В этом случае, т. е. мы возвращаемся к ранее созданной записи и хотим заполнить форму существующими данными, необходимо выбрать опцию .

Мы можем добиться этого, добавив атрибут th:selected вместе с некоторыми условиями:

<select th:field="*{percentage}">
<option th:each="i : ${#numbers.sequence(0, 100)}" th:value="${i}" th:text="${i}"
th:selected="${i==75}"></option>
</select>

В приведенном выше примере мы хотим предварительно выбрать значение 75, проверив , равно ли i 75.

Однако этот код не будет работать, и отображаемый HTML-код будет таким:

<select id="percentage" name="percentage">
<option value="0">0</option>
...
<option value="74">74</option>
<option value="75">75</option>
<option value="76">76</option>
...
<option value="100">100</option>
</select>

Чтобы исправить это, нам нужно удалить поле th: и заменить его атрибутами name и id :

<select id="percentage" name="percentage">

В итоге получим:

<select id="percentage" name="percentage">
<option value="0">0</option>
...
<option value="74">74</option>
<option value="75" selected="selected">75</option>
<option value="76">76</option>
...
<option value="100">100</option>
</select>

4. Заполните раскрывающийся список списком

Давайте посмотрим, как заполнить раскрывающийся список списком в Thymeleaf. Для этого мы создадим список строк в контроллере и отобразим его в представлении.

Во-первых, давайте создадим контроллер с методом, который инициализирует список строк. Во-вторых, мы будем использовать атрибуты модели для хранения нашего списка для рендеринга внутри представления.

@RequestMapping(value = "/populateDropDownList", method = RequestMethod.GET) 
public String populateList(Model model) {
List<String> options = new ArrayList<String>();
options.add("option 1");
options.add("option 2");
options.add("option 3");
model.addAttribute("options", options);
return "dropDownList/dropDownList.html";
}

Наконец, мы можем обратиться к нашему атрибуту модели списка и перебрать его, чтобы отобразить каждый элемент списка как вариант раскрывающегося списка.

<select class="form-control" id="dropDownList">
<option value="0">select option</option>
<option th:each="option : ${options}" th:value="${option}" th:text="${option}"></option>
</select>

5. Вывод

В этой короткой статье мы проверили, как работать с селекторами раскрывающегося списка/списка в Thymeleaf. Существует одна распространенная ошибка при предварительном выборе значений, для которой мы показали решение.

Как всегда, код, использованный во время обсуждения, можно найти на GitHub .