Как сделать 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.