Как сделать if-else в Тимелеафе?
Какой лучший способ сделать простой if-else в Thymeleaf?
Я хочу достичь в Тимелеафе того же эффекта, что и
<c:choose>
<c:when test="${potentially_complex_expression}">
<h2>Hello!</h2>
</c:when>
<c:otherwise>
<span class="xxx">Something else</span>
</c:otherwise>
</c:choose>
в JSTL.
Что я догадался до сих пор:
<div th:with="condition=${potentially_complex_expression}" th:remove="tag">
<h2 th:if="${condition}">Hello!</h2>
<span th:unless="${condition}" class="xxx">Something else</span>
</div>
Я не хочу дважды оценивать potentially_complex_expression
. Поэтому я ввел локальную переменную condition
.
Тем не менее мне не нравятся использование как th:if="${condition}
, так и th:unless="${condition}"
.
Важно то, что я использую 2 разных html-тега: пусть h2
и span
.
Можете ли вы предложить лучший способ достичь этого?
Ответы
Ответ 1
Тимелеаф имеет эквивалент <c:choose>
и <c:when>
: атрибуты th:switch
и th:case
, введенные в Thymeleaf 2.0.
Они работают так, как вы ожидали, используя *
для случая по умолчанию:
<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>
См. http://www.thymeleaf.org/whatsnew20.html#swit для быстрого объяснения синтаксиса (или учебных пособий тимелеафа).
Отказ от ответственности, в соответствии с правилами StackOverflow: Я автор тимелеафа.
Ответ 2
Я попробовал этот код, чтобы узнать, зарегистрирован ли пользователь или анонимен. Я использовал условные выражения th:if
и th:unless
. Довольно простой способ сделать это.
<!-- IF CUSTOMER IS ANONYMOUS -->
<div th:if="${customer.anonymous}">
<div>Welcome, Guest</div>
</div>
<!-- ELSE -->
<div th:unless="${customer.anonymous}">
<div th:text=" 'Hi,' + ${customer.name}">Hi, User</div>
</div>
Ответ 3
Я хотел бы поделиться своим примером, связанным с безопасностью, в дополнение к Даниэлю Фернандесу.
<div th:switch="${#authentication}? ${#authorization.expression('isAuthenticated()')} : ${false}">
<span th:case="${false}">User is not logged in</span>
<span th:case="${true}">Logged in user</span>
<span th:case="*">Should never happen, but who knows...</span>
</div>
Вот сложное выражение со смешанными объектами утилиты "аутентификации" и "авторизации", которое создает результат "true/false" для кода шаблона тимелеафа.
Объекты утилиты "аутентификации" и "авторизации" пришли из библиотека тимэлефов extras springsecurity3.
Когда объект аутентификации недоступен ИЛИ authorization.expression('isAuthenticated()') оценивается как 'false', выражение возвращает ${false}, в противном случае ${true}.
Ответ 4
Вы можете использовать
If-then-else: (if) ? (then) : (else)
Пример:
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
Это может быть полезно для новых людей, задающих тот же вопрос.
Ответ 5
Другое решение - вы можете использовать локальную переменную:
<div th:with="expr_result = ${potentially_complex_expression}">
<div th:if="${expr_result}">
<h2>Hello!</h2>
</div>
<div th:unless="${expr_result}">
<span class="xxx">Something else</span>
</div>
</div>
Подробнее о локальных переменных:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables
Ответ 6
В более простом случае (когда теги html совпадают):
<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>
Ответ 7
Другое решение, которое просто использует not
, чтобы получить противоположное отрицание:
<h2 th:if="${potentially_complex_expression}">Hello!</h2>
<span class="xxx" th:if="${not potentially_complex_expression}">Something else</span>
В документации объясняется, что это так же использовать th:unless
, как объяснялось в других ответах:
Кроме того, th:if
имеет обратный атрибут th:unless
, который мы могли бы иметь используемый в предыдущем примере вместо использования не внутри OGNL Выражение
Итак, defintetively используя not
, он также работает, но IMHO более читаем, используйте th:unless
вместо того, чтобы отрицать условие с not
.