java - thymeleaf if else
¿Cómo hacer if-else en Thymeleaf? (8)
¿Cuál es la mejor manera de hacer un if-else simple en Thymeleaf?
Quiero lograr en Thymeleaf el mismo efecto que
<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>
en JSTL.
Lo que he calculado hasta ahora:
<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>
No quiero evaluar potentially_complex_expression
dos veces. Es por eso que introduje la condition
variable local.
Aún así, no me gusta usar th:if="${condition}
y th:unless="${condition}"
.
Lo importante es que utilizo 2 etiquetas html diferentes: digamos h2
y span
.
¿Puedes sugerir una mejor manera de lograrlo?
En caso más simple (cuando las etiquetas html son las mismas):
<h2 th:text="${potentially_complex_expression} ? ''Hello'' : ''Something else''">/h2>
Intenté este código para averiguar si un cliente está conectado o es anónimo. Lo hice usando th:if
y th:unless
expresiones condicionales. Una manera bastante simple de hacerlo.
<!-- 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>
Me gustaría compartir mi ejemplo relacionado con la seguridad además de Daniel Fernández.
<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>
Aquí está la expresión compleja con objetos de utilidad mixtos de ''autenticación'' y ''autorización'' que produce el resultado ''verdadero / falso'' para el código de plantilla de hoja de tomillo.
Los objetos de utilidad ''autenticación'' y ''autorización'' provienen de thymeleaf extras springsecurity3 library . Cuando el objeto ''autenticación'' no está disponible O authorization.expression (''isAuthenticated ()'' se evalúa como ''falso'', la expresión devuelve $ {false}, de lo contrario $ {true}.
Otra solución es simplemente usar not
para obtener la negación opuesta:
<h2 th:if="${potentially_complex_expression}">Hello!</h2>
<span class="xxx" th:if="${not potentially_complex_expression}">Something else</span>
Como se explica en la documentation , es lo mismo que usar th:unless
. Como otras respuestas han explicado:
Además,
th:if
tiene un atributo inverso,th:unless
, que podríamos haber usado en el ejemplo anterior en lugar de usar a no dentro de la expresión OGNL
Usar not
funciona también, pero en mi humilde opinión, es más fácil usar th:unless
lugar de negar la condición not
th:unless
.
Otra solución: puede usar la variable local:
<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>
Más sobre las variables locales:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables
Puedes usar
If-then-else: (if) ? (then) : (else)
Ejemplo:
''User is of type '' + (${user.isAdmin()} ? ''Administrator'' : (${user.type} ?: ''Unknown''))
Podría ser útil para las personas nuevas que hacen la misma pregunta.
Thymeleaf tiene un equivalente a <c:choose>
y <c:when>
: los atributos th:switch
y th:case
introducidos en Thymeleaf 2.0.
Funcionan como era de esperar, utilizando *
para el caso predeterminado:
<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>
Consulte http://www.thymeleaf.org/whatsnew20.html#swit para obtener una explicación rápida de la sintaxis (o los tutoriales de thymeleaf).
Descargo de responsabilidad, según lo exigen las reglas de : soy el autor de thymeleaf.
<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>