Thymeleafチートシート【Spring Boot】

  • LINEで送る
thymeleafチートシート

 このチートシートでは、Spring Bootと連携して使うThymeleafの基本的な構文や使い方を一通り確認できます。変数の出力、条件分岐、ループ処理、フォームとの連携、共通パーツの再利用、JavaScriptとの連携まで、実践的なテンプレート開発に必要な知識を網羅的に確認できます。

 困ったらこのシート見れば解決できます!

1. テキストの出力 th:text

HTMLに変数の内容を出力したいとき

<p th:text="${message}">ここは上書きされます</p>

${message} の内容が出力され、タグ内の「ここは上書きされます」は無視されます(サーバーサイドで完全に置換)。


2. 属性の動的設定 th:attr, th:href, th:src など

aタグやimgタグのリンク先や画像パスも動的に

<a th:href="@{/hello}">リンク</a>
<img th:src="@{/images/logo.png}" />

@{} はURLの構築用。クエリパラメータも渡せます。 例:@{/search(q=${keyword})}/search?q=xxx


3. 条件分岐 th:if, th:unless

表示・非表示の切り替えが簡単に可能

<p th:if="${isAdmin}">管理者メニュー</p>
<p th:unless="${isAdmin}">一般メニュー</p>

th:if は条件を満たすと表示。th:unless は逆に「条件を満たさないとき」に表示。


4. ループ処理 th:each

リストや配列をぐるぐる回して表示したいとき

<ul>
  <li th:each="user : ${userList}" th:text="${user.name}">名前</li>
</ul>

userList がリストなら、1人ずつ取り出して user.name を表示。

使える変数:

* ${userStat.index}   // インデックス(0スタート)
* ${userStat.count}   // 1スタートの番号
* ${userStat.size}    // 全体のサイズ
* ${userStat.first}   // 最初の要素か?
* ${userStat.last}    // 最後の要素か?

5. 入力フォームの連携 th:field

Spring MVCのFormクラスと連携するときに便利

<form th:action="@{/submit}" th:object="${form}" method="post">
  <input type="text" th:field="*{name}" />
</form>

form.getName() の値をバインドし、POST時にも送信されます。


6. 定数やユーティリティの利用

よく使う定数や日付の書式など、便利機能がある

<p th:text="${T(java.lang.Math).random()}">ランダム</p>
<p th:text="${#dates.format(today, 'yyyy/MM/dd')}">日付</p>

ユーティリティオブジェクト例:

  • dates:日付処理
  • strings:文字列操作(空チェックなど)
  • lists, #maps, #arrays:コレクション処理
  • numbers:数値フォーマット
  • bools:真偽値の判定
  • objects:nullチェックやequals比較

7. フラグメントの再利用 th:replace, th:include, th:insert

ヘッダーやフッターなど共通パーツを再利用

<!-- ヘッダーを挿入 -->
<div th:replace="fragments/header :: headerFragment"></div>

fragments/header.html の中に <div th:fragment="headerFragment"> を定義しておく。

  • th:replace:完全に置き換える(外側のタグ含む)
  • th:insert:内側に差し込む
  • th:include(非推奨):古い書き方

8. コメントと無視されるコード(コメントアウト)

HTMLに残したくないコメントや、一時的な無効化に使える

<!--/* これはThymeleaf専用コメントでHTMLには出力されません */-->

9. 三項演算子とnull対策

シンプルな条件分岐やnull安全なコードも書ける

<span th:text="${user.name != null ? user.name : '名前未設定'}"></span>
<span th:text="${user.name ?: '未入力'}"></span> <!-- null合体演算 -->

10. th:object との組み合わせでネストされたプロパティもOK

<form th:object="${form}">
  <input th:field="*{address.city}" />
</form>

form.getAddress().getCity() にバインドされます。


11. テーブルのループ表示(実践例)

<table>
  <thead>
    <tr><th>#</th><th>名前</th><th>年齢</th></tr>
  </thead>
  <tbody>
    <tr th:each="user, stat : ${userList}">
      <td th:text="${stat.count}"></td>
      <td th:text="${user.name}"></td>
      <td th:text="${user.age}"></td>
    </tr>
  </tbody>
</table>

stat.count で行番号を出せる便利パターン。


12. JavaScriptとの連携 th:inline="javascript"

<script th:inline="javascript">
  let username = [[${user.name}]];
</script>

→ HTMLでは展開されないが、JS変数にサーバー値を埋め込める。


13. セレクトボックスの表示

<select th:field="*{gender}">
  <option value="M">男性</option>
  <option value="F">女性</option>
</select>

th:field を使えば、Java側の値に応じて該当する <option> が自動で選択された状態になります。


14. チェックボックスやラジオボタン

<input type="checkbox" th:field="*{agree}" />
<input type="radio" th:field="*{type}" value="A" /> A
<input type="radio" th:field="*{type}" value="B" /> B

→ 値が自動バインドされ、選択状態も反映される。


🧼 よくある間違いと対策

  • th:text="${user.name}" を書いたのにHTMLで反映されない → application.propertiesspring.thymeleaf.cache=false を忘れていませんか?
  • <input type="text" value="..." th:value="..."> のように両方書くと動かない → value 属性は th:value で上書きされます。重複に注意。
  • HTMLタグが壊れる → <html><head> に Thymeleaf属性を入れるときは正しいDOCTYPEやxmlnsの設定を忘れずに。
  • フラグメントが見つからない → :: の右側は th:fragment 名を正確に!ファイルパスや拡張子も注意。

まとめ

 ThymeleafはHTMLに自然に組み込めるテンプレートエンジンで、th:属性を使えば、Javaオブジェクトの出力、条件分岐、繰り返し、フォームのバインディングまで、すべて直感的に書けます。HTMLとしてもそのまま見えるので、デザイナーとの協業にも向いています。困ったら「何を出力したいか」「どんな条件で表示したいか」から逆算して、th:text, th:if, th:each などの属性を思い出しましょう。

最新の投稿

SNSでもご購読できます。

コメント

コメントを残す