Comment faire si-autre dans Thymeleaf?
Quelle est la meilleure façon de faire un simple if-else dans Thymeleaf?
Je veux obtenir dans Thymeleaf le même effet 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>
Dans JSTL.
Ce que j'ai pensé jusqu'à présent:
<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>
Je ne veux pas évaluer potentially_complex_expression
deux fois. C'est pourquoi j'ai introduit la variable locale condition
.
Je N'aime toujours pas utiliser à la fois th:if="${condition}
et th:unless="${condition}"
.
La chose importante est que j'utilise 2 balises html différentes: disons h2
et span
.
Pouvez-vous suggérer une meilleure façon d'atteindre il?
8 réponses
Thymeleaf a un équivalent à <c:choose>
et <c:when>
: la th:switch
et th:case
attributs introduits dans Thymeleaf 2.0.
Ils fonctionnent comme prévu, en utilisant *
pour le cas par défaut:
<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>
Voir http://www.thymeleaf.org/whatsnew20.html#swit pour une explication rapide de la syntaxe (ou des tutoriels thymeleaf).
Avertissement, tel que requis par les règles de StackOverflow: je suis l'auteur de thymeleaf.
, j'ai essayé ce code pour savoir si un client est connecté ou anonymes. J'ai utilisé les expressions conditionnelles th:if
et th:unless
. Façon assez simple de le faire.
<!-- 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>
Je voudrais partager mon exemple lié à la sécurité en plus 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>
Voici une expression complexe avec des objets utilitaires 'authentication' et 'authorization' mixtes qui produit un résultat 'true / false' pour le code de modèle thymeleaf.
Les objets utilitaires' authentication 'et' authorization ' proviennent de Thymeleaf extras springsecurity3 library. Lorsque l'objet' authentification ' n'est pas disponible ou l'autorisation.expression ('isAuthenticated ()') évalue "faux", l'expression renvoie ${false}, sinon, ${vrai}.
Vous pouvez utiliser
If-then-else: (if) ? (then) : (else)
Exemple:
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
Cela pourrait être utile pour les nouvelles personnes qui posent la même question.
Dans le cas plus simple (lorsque les balises html sont les mêmes):
<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>
Une Autre solution, vous pouvez utiliser la variable locale:
<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>
Plus sur les variables:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables
Une autre solution consiste simplement à utiliser not
pour obtenir la négation opposée:
<h2 th:if="${potentially_complex_expression}">Hello!</h2>
<span class="xxx" th:if="${not potentially_complex_expression}">Something else</span>
Comme expliqué dans la documentation , c'est la même chose que d'utiliser th:unless
. Comme d'autres réponses l'ont expliqué:
Aussi,
th:if
a un attribut inverse,th:unless
, que l'on pourrait avoir utilisé dans l'exemple précédent au lieu d'utiliser un not inside the OGNL expression
L'utilisation de not
fonctionne également, mais à mon humble avis, il est plus lisible d'utiliser th:unless
au lieu de nier le condition avec 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>