Учебное Пособие По Thymeleaf: Глава 6. Итерации

Оглавление



6 итераций

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

но как насчет наших продуктов? Для этого нам нужен способ перебора элементов коллекции.



6.1 Основы итерации

Мы используем таблицу для отображения продуктов на нашей странице /WEB-INF/templates/product/list.html. Каждый из продуктов отображается в строке (значок element), поэтому мы создаем его и говорим Thymeleaf повторить его один раз для каждого продукта.

Стандартный диалект предлагает особый атрибут: й: каждый .

Использование th:each Для страницы списка продуктов вам понадобится метод контроллера, который извлекает список продуктов из уровня сервиса и добавляет его в контекст шаблона:

  
  
  
  
  
  
  
   

public void process( final HttpServletRequest request, final HttpServletResponse response, final ServletContext servletContext, final ITemplateEngine templateEngine) throws Exception { ProductService productService = new ProductService(); List<Product> allProducts = productService.findAll(); WebContext ctx = new WebContext(request, response, servletContext, request.getLocale()); ctx.setVariable("prods", allProducts); templateEngine.process("product/list", ctx, response.getWriter()); }

И тогда мы будем использовать й: каждый в нашем шаблоне для перебора списка продуктов:

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org "> <head> <title>Good Thymes Virtual Grocery</title> <meta http-equiv="Content-Type" content="текст/html; кодировка = UTF-8" /> <link rel="stylesheet" type="text/css" media="all" href=".

/.

/.

/css/gtvg.css" th:href="@{/css/gtvg.css }" /> </head> <body> <h1>Product list</h1> <table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOCK</th> </tr> <tr th:each="prod : ${prods}"> <td th:text="${prod.name }">Onions</td> <td th:text="${prod.price }">2.41</td> <td th:text="${prod.inStock }? #{true} : #{false}">yes</td> </tr> </table> <p> <a href=".

/home.html" th:href="@{/ }">Return to home</a> </p> </body> </html>

Атрибут продукт: ${prods} , который вы видите выше, означает «для каждого элемента результат выполнения ${продукты} , повторим этот фрагмент шаблона, используя текущий элемент переменной с именем prod».

Давайте дадим каждой вещи, которую мы видим, имя:

  • Мы позвоним ${продукты} повторяющееся выражение или повторяющаяся переменная
  • Мы будем называть prod переменной итерации или просто переменной iter.
  • Обратите внимание, что переменная prod привязана к элемент, что означает, что он доступен для внутренних тегов, таких как
Итерируемые значения Класс java.util.List — не единственный, который можно использовать для итерации в Thymeleaf. Существует довольно большой набор объектов, подходящих для й: каждый атрибут:
  • Любой объект, реализующий java.util.Iterable.
  • Любой объект, реализующий java.util.Enumeration.
  • Любой объект, реализующий java.util.Iterator, значения которого будут использоваться по мере их возврата итератором, без необходимости кэширования всех значений в памяти.

  • Любой объект, реализующий java.util.Map. При итерации карт переменные iter будут иметь класс java.util.Map.Entry.
  • Любой массив
  • Любой другой объект будет рассматриваться как однозначный список, содержащий сам объект.


6.2 Сохранение статуса итерации

С использованием й: каждый Thymeleaf предлагает механизм, полезный для отслеживания состояния вашей итерации: переменную состояния.

Переменные состояния определяются внутри атрибута й: каждый и содержать следующие данные:

  • Текущий индекс итерации, начиная с 0. Это свойство индекса.

  • Текущий индекс итерации, начиная с 1. Это свойство count.
  • Общее количество элементов в повторяемой переменной.

    Это свойство размера

  • Переменная Iter для каждой итерации.

    Это текущий объект недвижимости

  • Будет ли текущая итерация четной или нечетной.

    Это четные/нечетные логические свойства.

  • Является ли текущая итерация первой.

    Это первое логическое свойство

  • Является ли текущая итерация последней.

    Это последнее логическое свойство

Давайте посмотрим, как мы можем использовать итеративные свойства:

<table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOCK</th> </tr> <tr th:each="prod,iterStat : ${prods}" th:class="${iterStat.odd}? 'odd'"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{false}">yes</td> </tr> </table>

Переменная состояния ( iterStat в этом примере) определяется в атрибуте й: каждый , написав свое имя после самой переменной iter через запятую.

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

<!DOCTYPE html> <html> <head> <title>Good Thymes Virtual Grocery</title> <meta content="текст/html; кодировка = UTF-8" http-equiv="Content-Type"/> <link rel="stylesheet" type="text/css" media="all" href="/gtvg/css/gtvg.css" /> </head> <body> <h1>Product list</h1> <table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOCK</th> </tr> <tr class="odd"> <td>Fresh Sweet Basil</td> <td>4.99</td> <td>yes</td> </tr> <tr> <td>Italian Tomato</td> <td>1.25</td> <td>no</td> </tr> <tr class="odd"> <td>Yellow Bell Pepper</td> <td>2.50</td> <td>yes</td> </tr> <tr> <td>Old Cheddar</td> <td>18.75</td> <td>yes</td> </tr> </table> <p> <a href="/gtvg/" shape="rect">Return to home</a> </p> </body> </html>

Обратите внимание, что наша переменная положение дел итерация работает нормально, устанавливая нечетный класс CSS только для нечетных строк.

Если вы явно не определите переменную состояния, Thymeleaf всегда создаст ее для вас, добавив суффикс Стат к имени переменной итерации:

<table> <tr> <th>NAME</th> <th>PRICE</th> <th>IN STOCK</th> </tr> <tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{false}">yes</td> </tr> </table>



6.3 Оптимизация путем отложенного извлечения данных

Иногда нам может потребоваться оптимизировать обход коллекций данных (например, из базы данных), чтобы эти коллекции извлекались только тогда, когда они действительно будут использоваться.

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

Для поддержки этого механизма Thymeleaf предлагает инструменты для ленивая загрузка контекстные переменные.

Переменные контекста, реализующие интерфейс ILazyContextVariable, скорее всего, будут разрешены во время выполнения путем расширения реализации LazyContextVariable по умолчанию.

Например:

context.setVariable( "users", new LazyContextVariable<List<User>>() { @Override protected List<User> loadValue() { return databaseRepository.findAllUsers(); } });

Эту переменную можно использовать, не зная, ленива ли она, например:

<ul> <li th:each="u : ${users}" th:text="${u.name}">user name</li> </ul>

Но при этом оно никогда не будет инициализировано (никогда не будет вызван метод loadValue()), если в коде условие окажется ложным, например:

<ul th:if="${condition}"> <li th:each="u : ${users}" th:text="${u.name}">user name</li> </ul>

Теги: #java #Thymeleaf #java

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.