web-dev-qa-db-ja.com

Thymeleafでif-elseをする方法?

Thymeleafで単純なif-elseを実行するための最良の方法は何ですか?

Thymeleafでも同じ効果を達成したい

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

jSTLで。

私がこれまでに考え出したもの:

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

potentially_complex_expressionを2回評価したくありません。ローカル変数conditionを導入したのはそのためです。

それでも私はth:if="${condition}th:unless="${condition}"の両方を使うのは好きではありません。

重要なことは、2つの異なるHTMLタグを使用することです。h2spanを言いましょう。

あなたはそれを達成するためのより良い方法を提案できますか?

108
Maciej Ziarko

Thymeleafは<c:choose>および<c:when>と同等のものを持ちます:Thymeleaf 2.0で導入されたth:switchおよびth:case属性。

デフォルトのケースでは*を使用して、あなたは思った通りに動作します。

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

構文の簡単な説明(またはthymeleafチュートリアル)については、 http://www.thymeleaf.org/whatsnew20.html#swit を参照してください。

免責事項、StackOverflowルールで要求されている通り:私はthymeleafの作者です。

179

私はこのコードを試して、顧客がログインしているのか匿名なのかを調べました。私はth:ifth:unless条件式を使いました。簡単な方法です。

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

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

これは、thymeleafテンプレートコードに対して 'true/false'の結果を生成する 'authentication'および 'authorization'ユーティリティオブジェクトが混在した複雑な式です。

'authentication'および 'authorization'ユーティリティオブジェクトは thymeleaf extras springsecurity3 library から来ました。 'authentication'オブジェクトが使用できない場合OR authorization.expression( 'isAuthenticated()')が 'false'に評価されると、expressionは$ {false}を返し、それ以外の場合は$ {true}を返します。

19
blandger

あなたが使用することができます

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

例:

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

それは、同じ質問をする新しい人々にとって役に立つかもしれません。

17
Jad B.

別の解決策 - ローカル変数を使うことができます。

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

ローカル変数についての詳細:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#local-variables

10
jareks

もっと単純な場合(htmlタグが同じ場合):

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

別の解決策は反対の否定を得るためにnotを使うことです:

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

ドキュメント で説明されているように、これはth:unlessを使うのと同じことです。他の答えが説明したように:

また、th:ifには逆の属性th:unlessがあります。これは、前の例で使用できたものです代わりにOGNL式の内側に使用するのではなく

notを使用しても機能しますが、notで条件を否定する代わりにth:unlessを使用する方が読みやすくなります。

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

ここに画像の説明を入力してください

1