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>