Thymeleafのあれこれ
Thymeleafにおけるアンダースコアの扱い
Thymeleafにおけるアンダースコア2つ(__)は、プリプロセッシング用の文字列のため、
属性のなかでアンダースコアが2つあるようなCSSのクラス名を指定するときは、バックスラッシュをつけて\_\_
とエスケープする必要がある。
Header__css__class__index
みたいなCSSのクラスをclass属性に設定しようとする場合
(indexは1~10の値が可変で入るとする)
<th:class="|Header__css__class__${index}|"/>
このままだと、アンダースコア(__)がパースされて画面表示されるときはHeadercssclass secondClass1
みたいになってしまう。
下記のようにすると、きちんとHeader__css__class__1
みたいになる
<th:class="|Header\_\_css\_\_class\_\_${index}|"/>
パーサレベルのコメントブロック
HTMLの標準のコメント<!-- コメント -->
だと、実際に表示されるページのソースに残ってしまう。
こんな感じに↓
それがパーサーレベルのコメントブロック <!-- /*コメント*/ -->
にすると、Thymeleafがそれをパースする際にテンプレートから削除してくれて、実際のページソースに残らなくなる。
Thymeleafは<!--/*
と*/-->
の間にあるもの全てを完全に削除するため、実際のHTMLには表示されない。
属性の優先順位
Thymeleafの全ての属性には数値の優先順位が定義されている。
例
isDisplayがtrueのときだけ、layouts/display.html が表示されてほしいとして、
下記のようなコードを書いたとする。
<th:block th:if="${isDisplay}" th:replace="layouts/display.html" />
しかし、Thymeleafが属性の評価をする優先順位により、
th:if
よりth:replace
のほうが先に評価されてしまうため、
isDisplayの真偽値に関わらず、layouts/display.htmlが表示されてしまう。
解決策
表示・非表示を切り分けたいブロックより上位に別のブロックを追加し、
そちらに判定文を記載する。
<th:block th:if="${isDisplay}" >
<th:block th:replace="layouts/display.html" />
</th:block>