Как сделать если-нибудь в 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>