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

Итерация в Тимелеафе

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

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 .