Comment faire if-else dans Thymeleaf?

132

Quelle est la meilleure façon de faire un simple if- elsedans 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_expressiondeux 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}".

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

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

Maciej Ziarko
la source

Réponses:

208

Thymeleaf a un équivalent à <c:choose>et <c:when>: les attributs th:switchet th:caseintroduits 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 ceci pour une explication rapide de la syntaxe (ou les didacticiels Thymeleaf).

Clause de non - responsabilité : conformément aux règles de StackOverflow, je suis l'auteur de Thymeleaf.

Daniel Fernández
la source
ok mais .. comment invoquer un javascript basé sur le type de client (c'est-à-dire anonyme ou connecté) ...
Chanceux
1
Voir le chapitre "Text inlining", plus précisément la section "JavaScript inlining" du didacticiel "Utilisation de Thymeleaf" dans thymeleaf.org/documentation.html
Daniel Fernández
Et comment puis-je faire th: activer une valeur iterator.index? Je veux faire un ensemble de cas où la valeur est <5, et passer au cas par défaut si la valeur est> 5
Loser Coder
@ DanielFernández: pouvez-vous s'il vous plaît m'aider avec stackoverflow.com/questions/48499723/… . Je ne pourrais pas vous taguer directement sur la question. Vraiment coincé.
jetée
98

J'ai essayé ce code pour savoir si un client est connecté ou anonyme. J'ai utilisé les expressions conditionnelles th:ifet 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>
Chanceux
la source
5
Cela ne répond pas à la question du PO car il s'agissait d'éviter de dupliquer des expressions complexes. Et comme d'autres solutions, cela brise l'idée des "modèles naturels", qui est un argument de vente majeur de Thymeleaf. Je ne sais pas quoi faire moi-même, mais je voulais juste le signaler au cas où quelqu'un aurait une réponse.
Stephen Harrison
@ Heureusement, cela me donne une erreur EL1007E: (pos 0): La propriété ou le champ 'Statut' est introuvable
Jesse
@Jackie Dans l'exemple ci-dessus, customer est un objet et anonyme est un champ booléen dans la classe Customer. Assurez-vous que votre objet n'est pas nul et que le nom du champ est correct.
Chanceux
25

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

Les objets utilitaires «authentification» et «autorisation» proviennent de la bibliothèque springsecurity3 de thymeleaf extras . Lorsque l'objet 'authentication' n'est pas disponible OU autorisation.expression ('isAuthenticated ()') prend la valeur 'false', l'expression renvoie $ {false}, sinon $ {true}.

fade
la source
19

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 posant la même question.

Jad B.
la source
12

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

jareks
la source
Je pense que vous avez ajouté un signe "=" supplémentaire dans votre code. Veuillez le vérifier à nouveau et le corriger si j'ai raison.
Lucky
À mon avis, le code est correct. Je ne sais pas de quel signe supplémentaire «=» vous parlez.
jareks
Oui, le code est ok. Désolé, je l'ai confondu avec le lieu th:eachoù l'expression a :au lieu de=
Chanceux
Mais cette réponse est très proche de ma solution. Faire le th: avec expression me semble redondant. Fondamentalement, cette solution utilise des instructions conditionnelles th: if et th: sauf.
Lucky du
Je pense que ce n'est pas redondant. Si vous n'utilisez que th: if et th: sauf si une expression complexe serait exécutée deux fois ...
jareks
9

Dans un cas plus simple (lorsque les balises html sont identiques):

<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>
Grigory Kislin
la source
Savez-vous comment ajouter des traductions pour «Bonjour» et «Quelque chose d'autre» dans cette expression?
Laura
@Laura Vous pouvez utiliser l'internationalisation et charger différentes traductions linguistiques en fonction de l'emplacement à partir du fichier de propriétés. Voir looksok.wordpress.com/tag/internationalization , marcelustrojahn.com/2016/12/…
Lucky
7

Une autre solution consiste simplement à utiliser notpour 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é:

De plus, th:ifa un attribut inverse th:unless, que nous aurions pu utiliser dans l'exemple précédent au lieu d'utiliser un non à l'intérieur de l'expression OGNL

L'utilisation notfonctionne également, mais à mon humble avis, il est plus lisible à utiliser th:unlessau lieu de nier la condition avec not.

Pau
la source
2
<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>
Daria Yu
la source
1
<div style="width:100%">
<span th:each="i : ${#numbers.sequence(1, 3)}">
<span th:if="${i == curpage}">
<a href="/listEmployee/${i}" class="btn btn-success custom-width" th:text="${i}"></a
</span>
<span th:unless="${i == curpage}">
<a href="/listEmployee/${i}" class="btn btn-danger custom-width" th:text="${i}"></a> 
</span>
</span>
</div>

entrez la description de l'image ici

Tứ Nguyễn Duy
la source
1

Utiliser th:switchcommeif-else

<span th:switch="${isThisTrue}">
  <i th:case="true" class="fas fa-check green-text"></i>
  <i th:case="false" class="fas fa-times red-text"></i>
</span>

Utiliser th:switchcommeswitch

<span th:switch="${fruit}">
  <i th:case="Apple" class="fas fa-check red-text"></i>
  <i th:case="Orange" class="fas fa-times orange-text"></i>
  <i th:case="*" class="fas fa-times yellow-text"></i>
</span>
Yatendra Goel
la source