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>
Автор: pilot911