it-swarm.com.de

Wie geht es if-else in Thymeleaf?

Was ist der beste Weg, um ein einfaches Wenn-sonst in Thymeleaf zu machen?

Ich möchte in Thymeleaf den gleichen Effekt erzielen wie

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

in JSTL.

Was ich bisher gefunden habe:

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

Ich möchte potentially_complex_expression nicht zweimal auswerten. Deshalb habe ich die lokale Variable condition eingeführt.

Trotzdem mag ich es nicht, th:if="${condition} und th:unless="${condition}" zu verwenden.

Wichtig ist, dass ich zwei verschiedene HTML-Tags verwende: Sagen wir h2 und span.

Können Sie einen besseren Weg vorschlagen, um dies zu erreichen?

96
Maciej Ziarko

Thymeleaf hat ein Äquivalent zu <c:choose> und <c:when>: die in Thymeleaf 2.0 eingeführten th:switch- und th:case-Attribute.

Sie funktionieren wie erwartet und verwenden * für den Standardfall:

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

Siehe http://www.thymeleaf.org/whatsnew20.html#swit für eine kurze Erklärung der Syntax (oder der Thymeleaf-Tutorials).

Haftungsausschluss, wie von den StackOverflow-Regeln gefordert: Ich bin der Autor von thymeleaf.

170

Ich habe diesen Code ausprobiert, um herauszufinden, ob ein Kunde angemeldet oder anonym ist. Ich habe die Bedingungsausdrücke th:if und th:unless verwendet. Ziemlich einfacher Weg.

<!-- 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>
64
Lucky

Ich möchte zusätzlich zu Daniel Fernández mein Beispiel zur Sicherheit mitteilen.

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

Hier ist ein komplexer Ausdruck mit gemischten "Authentifizierungs-" und "Berechtigungs" -Objektobjekten, die "True/False" -Ergebnis für Thymeleaf-Vorlagencode erzeugen.

Die Utility-Objekte 'authentication' und 'authorization' stammen aus der Bibliothek thymeleaf extras springsecurity3 . Wenn das 'authentication'-Objekt nicht verfügbar ist, wird OR authorization.expression (' isAuthenticated () ') mit' false ', Ausdruck gibt $ {false} zurück, andernfalls $ {true}.

19
blandger

Sie können verwenden 

If-then-else:  (if) ? (then) : (else)

Beispiel:

'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))

Es könnte für die neuen Leute nützlich sein, die dieselbe Frage stellen.

16
Jad B.

Im einfacheren Fall (wenn HTML-Tags gleich sind):

<h2 th:text="${potentially_complex_expression} ? 'Hello' : 'Something else'">/h2>
8
GKislin

Eine andere Lösung - Sie können lokale Variable verwenden:

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

Weitere Informationen zu lokalen Variablen:
http://www.thymeleaf.org/doc/tutorials/2.1/ usingthymeleaf.html#local-variables

7
jareks

Eine andere Lösung verwendet einfach not, um die gegenteilige Negation zu erhalten:

<h2 th:if="${potentially_complex_expression}">Hello!</h2>
<span class="xxx" th:if="${not potentially_complex_expression}">Something else</span>

Wie in der Dokumentation erklärt, ist es das Gleiche wie mit th:unless. Wie andere Antworten erklärt haben:

Außerdem hat th:if ein inverses Attribut th:unless, das wir haben könnten wird im vorherigen Beispiel verwendet, anstatt ein nicht in der OGNL verwendetes _. Ausdruck

Die Verwendung von not funktioniert auch, aber IMHO ist die Verwendung von th:unless besser lesbar, anstatt die Bedingung mit not zu negieren.

5
Pau
<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>
2
Vicky
<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>

Bildbeschreibung hier eingeben

1