1. Обзор
Thymeleaf - это универсальный шаблонизатор Java для обработки документов XML, XHTML и HTML5 .
В этом кратком руководстве мы рассмотрим, как мы можем выполнить итерацию с Thymeleaf, а также с некоторыми другими функциями, предоставляемыми библиотекой.
Чтобы узнать больше о Thymeleaf, взгляните на нашу ссылку на вступительную статью:/thymeleaf-in-spring-mvc[здесь].
2. Зависимости Maven
Чтобы создать этот пример, мы будем использовать библиотеки Spring Framework вместе с библиотеками Thymeleaf.
Здесь мы можем увидеть наши зависимости ( thymeleaf и https ://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.thymeleaf%22%20AND%20a%3A%22thymeleaf-spring4%22[thymeleaf-весенний]):
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
3. Пример настройки
Прежде чем перейти к слою вида, давайте создадим структуру MVC для нашего примера.
Начиная с кода фрагмента слоя модели:
public class Student implements Serializable {
private Integer id;
private String name;
//standard contructors, getters, and setters
}
Давайте также предоставим метод контроллера, отвечающий за загрузку модели и возврат ее на уровень представления:
@GetMapping("/listStudents")
public String listStudent(Model model) {
model.addAttribute("students", StudentUtils.buildStudents());
return "listStudents.html";
}
В нашем примере выше _buildStudents () method просто возвращает список объектов Student , которые мы затем добавляем в model_ .
4. Th: each Атрибут
В Thymeleaf итерация выполняется с использованием атрибута __th: each __atatribute
Одна из интересных особенностей этого атрибута состоит в том, что он будет принимать и выполнять итерацию по некоторым различным типам данных _, _ , таким как
-
объекты, реализующие java.util.Iterable
-
объекты, реализующие java.util.Map
-
массивы
-
любой другой объект обрабатывается так, как если бы это был однозначный список
содержащий один элемент
Теперь давайте вызовем _th: каждый атрибут _ с данными, которые мы установили в нашем примере выше:
<tr th:each="student: ${students}">
<td th:text="${student.id}"/>
<td th:text="${student.name}"/>
</tr>
Фрагмент кода показывает th: each итерацию по нашему списку Students . Доступ к атрибуту модели осуществляется через _ $ \ {} notation , а каждый элемент списка передается в тело цикла через переменную student _.
5. Переменная состояния
Thymeleaf также позволяет использовать полезный механизм для отслеживания итерационного процесса через переменную состояния .
Переменная состояния предоставляет следующие свойства:
-
index : текущий индекс итерации, начиная с 0 (ноль)
-
count : количество обработанных элементов
-
размер : общее количество элементов в списке
-
even/odd : проверяет, является ли текущий индекс итерации четным или нечетным
-
first : проверяет, является ли текущая итерация первой
-
last : проверяет, является ли текущая итерация последней
Давайте посмотрим, как работает переменная состояния в нашем примере:
<tr
th:each="student, iStat : ${students}"
th:style="${iStat.odd}? 'font-weight: bold;'"
th:alt-title="${iStat.even}? 'even' : 'odd'">
<td th:text="${student.id}"/>
<td th:text="${student.name}"/>
</tr>
Здесь мы включили свойство iStat.odd , чтобы оценить условие и установить жирный стиль для текущей строки. То же самое делается при следующей оценке, но на этот раз мы используем _iStat.even _ , чтобы напечатать значение через атрибут HTML alt/title.
В случае, если мы опускаем явное создание переменной состояния (представленной как iStat в нашем примере), мы можем вызвать нашу переменную состояния, просто используя _ studentStat , , которая является агрегацией переменной student с суффиксом Stat._
6. Заключение
В этой статье мы рассмотрели одну из многих функций библиотеки Thymeleaf.
Мы представили итерацию в Thymeleaf, используя атрибут th: each вместе с его готовыми свойствами.
Рабочая версия кода, показанного в этой статье, доступна в нашем GitHub хранилище .