Thymeleafテンプレートがthif条件内でparam値をレンダリングしない

Aug 25 2020

SpringBootアプリケーションにthymeleafテンプレートを使用しています。ここメインページの下に、

<div th:replace="content :: content"></div>

およびコンテンツフラグメント内、

<div th:fragment="content">
   <h4 th:if="${param.val== 'abc'}">SOME-TEXT</h4> // not working <h4 th:if="${param.val== 'abc'}" th:text="${param.val}"></h4> // not working <h4 th:text="${param.val}"></h4> // working and value is abc
   <h4 th:unless="${param.val== 'abc'}" th:text="${param.val}"></h4> // working - value in html text is abc
<h4 th:unless="${param.val== 'abc'}">SOME-TEXT</h4> // Working, value is SOME-TEXT
</div>

URL: domain/?val=abc

表示したい:param.val == 'abc'の場合、htmlのSOME-TEXT。値 'abc'はth:text内にあります。しかし、thの内部:失敗した場合。

param.valにいくつかの隠された余分な文字列が追加されたようですか?なにか提案を?

回答

1 andrewjames Aug 25 2020 at 00:41

Thymeleaf関数${param.val}は、と呼ばれるリクエストパラメータを返しますval。ただし、これは複数値のオブジェクト(配列など)である可能性があります。たとえば、これを検討してください(これは有効な構造です)。

?val=abc&val=def

したがって、単一値の文字列を操作するには、次のようにします。

<h4 th:if="${#strings.toString(param.val)} == 'abc'" th:text="'SOME-TEXT-2'">SOME-TEXT-1</h4>

これSOME-TEXT-2はWebページに印刷されます。

または、これを使用できます:

<h4 th:if="${#strings.toString(param.val)} == 'abc'">SOME-TEXT-1</h4>

どちらが印刷されSOME-TEXT-1ますか。

興味深いことに、最初の例を使用しval=abc&val=defた場合、これで何が起こるかを確認できます。

<h4 th:text="${param.val}"></h4> 

配列を出力します。

[abc, def]

一連の関連するチェックボックスを処理するときに、このようなものが表示される場合があります(一例として)。

更新:

ヌルチェックの場合、Thymeleafを使用して、次の操作を実行できます。

<h4 th:if="${param.val} != null and ${#strings.toString(param.val)} == 'abc'">SOME-TEXT-2</h4>

この特定のケースでは、問題を引き起こす可能性のあるnull値を使用して何もしていないため、実際には必要ありません。

オブジェクト内の値をチェーンしている場合、より関連性があります。nullポインターの例外を回避するにはfoo.bar.bazfooまたはbarがnullかどうかを確認する必要があります。

Springの式言語には安全なナビゲーション演算子があり、次のような場合に非常に役立ちますfoo.?bar.?baz。、Thymeleafのみの場合よりも簡潔なnull処理を記述できることを覚えておいてください。しかし、繰り返しになりますが、質問の特定の例とは関係ありません。