Итерация в Thymeleaf

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 хранилище .