Open7

Thymeleafのあれこれ

toranoko114toranoko114

Thymeleafにおけるアンダースコアの扱い

Thymeleafにおけるアンダースコア2つ(__)は、プリプロセッシング用の文字列のため、
属性のなかでアンダースコアが2つあるようなCSSのクラス名を指定するときは、バックスラッシュをつけて\_\_ とエスケープする必要がある。

https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html#:~:text=</p>-,4.12 プリプロセッシング,-ここまで見

toranoko114toranoko114

Header__css__class__indexみたいなCSSのクラスをclass属性に設定しようとする場合
(indexは1~10の値が可変で入るとする)

<th:class="|Header__css__class__${index}|"/>

このままだと、アンダースコア(__)がパースされて画面表示されるときはHeadercssclass secondClass1みたいになってしまう。

toranoko114toranoko114

下記のようにすると、きちんとHeader__css__class__1みたいになる

<th:class="|Header\_\_css\_\_class\_\_${index}|"/>
toranoko114toranoko114

パーサレベルのコメントブロック

HTMLの標準のコメント<!-- コメント -->だと、実際に表示されるページのソースに残ってしまう。
こんな感じに↓

それがパーサーレベルのコメントブロック <!-- /*コメント*/ --> にすると、Thymeleafがそれをパースする際にテンプレートから削除してくれて、実際のページソースに残らなくなる。

Thymeleafは<!--/**/-->の間にあるもの全てを完全に削除するため、実際のHTMLには表示されない。

https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html#標準的なhtmlxmlコメント:~:text=</div>-,11.2. Thymeleafパーサーレベルのコメントブロック,-パーサーレベルの

toranoko114toranoko114

属性の優先順位

Thymeleafの全ての属性には数値の優先順位が定義されている。

toranoko114toranoko114

isDisplayがtrueのときだけ、layouts/display.html が表示されてほしいとして、
下記のようなコードを書いたとする。

<th:block th:if="${isDisplay}" th:replace="layouts/display.html" />

しかし、Thymeleafが属性の評価をする優先順位により、
th:ifよりth:replaceのほうが先に評価されてしまうため、
isDisplayの真偽値に関わらず、layouts/display.htmlが表示されてしまう。

toranoko114toranoko114

解決策

表示・非表示を切り分けたいブロックより上位に別のブロックを追加し、
そちらに判定文を記載する。

<th:block th:if="${isDisplay}" >
  <th:block th:replace="layouts/display.html" />
</th:block>