Как сделать если-нибудь в Thymeleaf?
каков наилучший способ сделать простой if-else в Thymeleaf?
Я хочу добиться в 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
.
можете ли вы предложить лучший способ достичь этого?
8 ответов
Thymeleaf имеет эквивалент <c:choose>
и <c:when>
: the 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 для быстрого объяснения синтаксиса (или учебники thymeleaf).
отказ от ответственности, как того требуют правила StackOverflow: я автор thymeleaf.
я попробовал этот код, чтобы узнать, вошел ли клиент в систему или Анонимный. Я использовал 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>
Я хотел бы поделиться своим примером, связанным с безопасностью, в дополнение к Даниэлю Фернандесу.
<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" для кода шаблона thymeleaf.
объекты утилиты "аутентификация" и "авторизация" пришли из thymeleaf дополнительно springsecurity3 библиотека. Если объект' authentication ' недоступен или разрешение.выражение ('isAuthenticated ()') вычисляется как' false', выражение возвращает ${false}, иначе ${true}.
можно использовать
If-then-else: (if) ? (then) : (else)
пример:
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
Это может быть полезно для новых людей задают тот же вопрос.
в более простом случае (когда теги html одинаковы):
<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>
другое решение - вы можете использовать локальную переменную:
<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>
подробнее о local variables:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables
другое решение-просто используя 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 выражение
используя not
также работает, но ИМХО это более читабельно использовать th:unless
вместо отрицания условия с not
.
<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>
<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>