Как лучше реализовать if-else выражение в Thymeleaf?

Каким способом лучше всего реализовать выражение if-else в Thymeleaf?

Мне хотелось бы добиться в Thymeleaf того же, что я делаю в нижеприведенном примере на JSTL.

Пример с использованием JSTL:

<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>

Что мне на данный момент удалось сделать в Thymeleaf:

<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}".

Также стоит отметить, что я использую два разных тега HTML: H2 и SPAN - это важно!

Существует ли более корректный способ сделать тоже самое?


Ответы (1 шт):

Автор решения: Михаил Ребров

В Thymeleaf есть аналоги <c:choose> и <c:when>:
это атрибуты th:switch и th:case введенные в Thymeleaf 2.0.

Пример:

<div th:switch="${user.role}"> 
  <p th:case="'admin'">Пользователь является администратором</p>
  <p th:case="#{roles.manager}">Пользователь является менеджером</p>
  <p th:case="*">Пользователь имеет какую-то другую роль</p> 
</div>

Данная структура работает похоже аналогичному выражению switch в Java.
Выражение указанное в th:switch вычисляется и сравнивается с результатами вычислений внутри th:case
При этом атрибутом th:case="*" помечается случай, который долже выбираться по умолчанию(если никакой другой кейс не подходит).

Здесь можно чуть подробнее узнать об этом синтаксисе (или в туториалах Thymeleaf).


Ссылки:

→ Ссылка