153 votes

Comment faire des if-else 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 compris 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 les deux th:if="${condition} y th:unless="${condition}" .

Une chose importante est que j'utilise deux balises HTML différentes : disons que h2 y span .

Pouvez-vous suggérer une meilleure façon d'y parvenir ?

241voto

Daniel Fernández Points 2160

Thymeleaf a un équivalent à <c:choose> y <c:when> : le th:switch y 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>

Ver este pour une explication rapide de la syntaxe (ou les tutoriels de Thymeleaf).

Avis de non-responsabilité : Comme l'exigent les règles de StackOverflow, je suis l'auteur de Thymeleaf.

128voto

Lucky Points 748

J'ai essayé ce code pour savoir si un client est connecté ou anonyme. J'ai utilisé la méthode th:if y th:unless les expressions conditionnelles. Une 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>

31voto

blandger Points 390

J'aimerais 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 mixtes 'authentification' et 'autorisation' qui produit un résultat 'vrai/faux' pour le code du modèle thymeleaf.

Les objets utilitaires "authentification" et "autorisation" proviennent de l'application suivante bibliothèque springsecurity3 de thymeleaf extras . Si l'objet 'authentification' n'est pas disponible OU si authorization.expression('isAuthenticated()') vaut 'false', l'expression renvoie ${false}, sinon ${true}.

21voto

Jadenko88 Points 123

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.

15voto

jareks Points 603

Une autre solution - vous pouvez utiliser une 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>

En savoir plus sur les variables locales :
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X