Учебник Thymeleaf: Глава 7. Условное выполнение

Оглавление

7 Условное выполнение

7.1 Простые условия: «if» (если) и «unless» (если не)

Иногда вам понадобится фрагмент шаблона, чтобы появляться только в результате выполнения определенного условия.

Например, представьте, что мы хотим показать в таблице продуктов столбец с количеством комментариев, которые существуют для каждого продукта, и, если есть какие-либо комментарии — ссылку на страницу комментариев.

Для этого используем атрибут th:if:

<table>   <tr>     <th>NAME</th>     <th>PRICE</th>     <th>IN STOCK</th>     <th>COMMENTS</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>     <td>       <span th:text="${#lists.size(prod.comments)}">2</span> comment/s       <a href="comments.html"           th:href="@{/product/comments(prodId=${prod.id})}"           th:if="${not #lists.isEmpty(prod.comments)}">view</a>     </td>   </tr> </table>

Здесь очень много вещей, поэтому давайте сосредоточимся на важной строке:

<a href="comments.html"    th:href="@{/product/comments(prodId=${prod.id})}"     th:if="${not #lists.isEmpty(prod.comments)}">view</a>

Этот код создаст ссылку на страницу комментариев (с URL /product/comments) с параметром prodId, установленным на идентификатор продукта, но только если у продукта есть какие-либо комментарии.

Давайте посмотрим на полученную разметку:

<table>   <tr>     <th>NAME</th>     <th>PRICE</th>     <th>IN STOCK</th>     <th>COMMENTS</th>   </tr>   <tr>     <td>Fresh Sweet Basil</td>     <td>4.99</td>     <td>yes</td>     <td>       <span>0</span> comment/s     </td>   </tr>   <tr class="odd">     <td>Italian Tomato</td>     <td>1.25</td>     <td>no</td>     <td>       <span>2</span> comment/s       <a href="/gtvg/product/comments?prodId=2">view</a>     </td>   </tr>   <tr>     <td>Yellow Bell Pepper</td>     <td>2.50</td>     <td>yes</td>     <td>       <span>0</span> comment/s     </td>   </tr>   <tr class="odd">     <td>Old Cheddar</td>     <td>18.75</td>     <td>yes</td>     <td>       <span>1</span> comment/s       <a href="/gtvg/product/comments?prodId=4">view</a>     </td>   </tr> </table>

Отлично! Это именно то, что мы хотели.

Обратите внимание, что атрибут th:if будет не только оценивать логические условия. Его возможности немного выше этого, и он будет оценивать указанное выражение как истинное, следуя этим правилам:

Если значение не равно null:

  • Если значение является логическим и true
  • Если значение является числом и отличным от нуля
  • Если значение является символом и отличным от нуля
  • Если значение является String и не является «false», «off» или «no»
  • Если значение не является boolean, числом, символом или String

Если значение равно null, th:if будет установлено в значение false.

Кроме того, th:if имеет инверсивный атрибут, th:unless, который мы могли бы использовать в предыдущем примере вместо использования not (отрицания) внутри выражения OGNL:

<a href="comments.html"    th:href="@{/comments(prodId=${prod.id})}"     th:unless="${#lists.isEmpty(prod.comments)}">view</a>

7.2 Switch statements

Существует также способ условно отображать контент, используя эквивалент структуры switch в Java: набор атрибутов th:switch / th:case.

<div th:switch="${user.role}">   <p th:case="'admin'">User is an administrator</p>   <p th:case="#{roles.manager}">User is a manager</p> </div>

Обратите внимание, что как только один атрибут th:case оценивается как true, каждый другой атрибут th:case в том же контексте коммутатора оценивается как false.

Параметр по умолчанию указан как: th:case=»*»:

<div th:switch="${user.role}">   <p th:case="'admin'">User is an administrator</p>   <p th:case="#{roles.manager}">User is a manager</p>   <p th:case="*">User is some other thing</p> </div>
FavoriteLoadingДобавить в избранное
Posted in Без рубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *