1. Обзор
Thymeleaf — универсальный шаблонизатор Java для обработки документов XML, XHTML и HTML5 .
В этом кратком руководстве мы рассмотрим, как мы можем выполнять итерацию с помощью Thymeleaf, а также некоторые другие функции, предоставляемые библиотекой.
Для получения дополнительной информации о Thymeleaf ознакомьтесь с нашей вводной статьей здесь .
2. Зависимости Maven
Чтобы создать этот пример, мы будем использовать библиотеки Spring Framework вместе с библиотеками Thymeleaf.
Здесь мы можем увидеть наши зависимости ( thymeleaf и thymeleaf-spring ):
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.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()
просто возвращает список объектов Student
, которые мы затем добавляем в модель
.
4. th : каждый
атрибут
В Thymeleaf итерация достигается с помощью атрибута th:each .
Одна из интересных особенностей этого атрибута заключается в том, что он будет принимать и перебирать некоторые разные типы данных ,
например:
- объекты, реализующие
java.util.Iterable
- объекты, реализующие
java.util.Map
- массивы
- любой другой объект рассматривается как однозначный список, содержащий один элемент
Теперь давайте вызовем атрибут th:each
с данными, которые мы настроили в нашем примере выше:
<tr th:each="student: ${students}">
<td th:text="${student.id}" />
<td th:text="${student.name}" />
</tr>
Фрагмент кода показывает, как th:each
выполняет итерацию по нашему списку студентов
. Доступ к атрибуту модели осуществляется с помощью нотации ${}
, и каждый элемент списка передается в тело цикла через переменную студента .
5. Переменная состояния
Thymeleaf также включает полезный механизм для отслеживания процесса итерации через переменную состояния .
Переменная состояния предоставляет следующие свойства:
- index : текущий индекс итерации, начиная с 0 (ноль)
- count : количество элементов, обработанных до сих пор
- size : общее количество элементов в списке
- четный/нечетный : проверяет, является ли текущий индекс итерации четным или нечетным
- 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 .