Учебник 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>

