Thymeleafのth:withの使い方を完全ガイド!初心者でもわかる一時変数の利用方法
生徒
「Thymeleafで一時的に変数を使いたい場合ってどうすればいいですか?」
先生
「Thymeleafではth:withという属性を使うことで、一時的に変数を作成して使用することができますよ。」
生徒
「一時変数を使うとどんな場面で便利ですか?」
先生
「例えば、複数回使用する値を計算して変数に保存しておけば、テンプレート内で簡単に再利用できます。それでは、具体的な例を見ていきましょう!」
1. th:withとは?
「1. th:withとは?」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
th:withは、Thymeleafテンプレートで「その場だけ使う一時変数」を定義するための属性です。
HTMLタグに付けるだけで値を計算・保持でき、同じブロック(タグとその子要素)内で再利用できます。
Spring Boot+Thymeleafの画面で、同じ式を何度も書く手間を減らし、テンプレートの可読性と保守性をぐっと高めます。
▼ まずは超シンプルな例(文字を一時保存)
<div th:with="greet='こんにちは、Thymeleaf!'">
<p th:text="${greet}"></p>
<small>上と同じあいさつをここでも使えます:<span th:text="${greet}"></span></small>
</div>
ここではgreetという一時変数を作り、同じブロック内の複数箇所で再利用しています。
値はタグの外には漏れません。計算結果やテキストをまとめておけるので、重複を避けたいときに便利です。
例えば、税込み価格や表示用の文字列を一度だけ作って何度も参照したい場面、ヘッダーやカード内で共通の値を使い回したい場面に最適です。
「テンプレートで軽い加工をして、画面内で繰り返し使う」という用途に強く、Thymeleafのth:textやth:ifなど他の属性とも自然に組み合わせられます。
まずは上のような短い文字列から試し、ブロック内限定で効く「スコープ」の感覚に慣れていきましょう。
2. th:withの基本的な使い方
th:withは「このタグ配下でだけ使える一時変数」を定義します。書き方はキー=値のペアをカンマでつなぐだけ。
同じ計算式を何度も書かなくてよくなるため、テンプレートがすっきり読みやすくなります。まずは合計金額の計算から見てみましょう。
▼ 合計を一度だけ計算して使い回す
<div class="card" th:with="total=${price * quantity}">
<p>商品の価格: <span th:text="${price}"></span>円</p>
<p>購入数: <span th:text="${quantity}"></span></p>
<p>合計金額: <span th:text="${total}"></span>円</p>
<small class="text-muted">上のブロック内ならどこでも<code>${total}</code>を再利用できます。</small>
</div>
ここで作ったtotalは、このdivの中だけで有効です。タグの外へは出ないので、
同名の変数が他所にあっても干渉しません。スコープが明確になるのが安心ポイントです。
▼ 文字列の組み立ても一時変数で簡単に
<section th:with="label=${userName} + ' さんのカート'">
<h3 th:text="${label}"></h3>
<p>合計は上の例の <code>total</code> のように別途計算して表示できます。</p>
</section>
表示用の文言を一度だけ作っておけば、見出しや説明に同じテキストを繰り返し差し込めます。 細かな文言調整が必要なときにも、更新箇所を最小限にできます。
▼ 複数の一時変数を並べて定義する(入門)
<div th:with="subtotal=${price * quantity}, tax=${subtotal * 0.1}">
<p>小計: <span th:text="${subtotal}"></span>円</p>
<p>消費税: <span th:text="${tax}"></span>円</p>
<p>支払合計: <span th:text="${subtotal + tax}"></span>円</p>
</div>
カンマ区切りで複数定義できます。前で作った変数(ここではsubtotal)を次の式(tax)で参照できるため、
計算の手順をテンプレートにそのまま素直に表現できます。
使い方のコツは「ブロックの入り口で一度だけ作る」こと。そうすれば、下に続く要素で同じ値を何度でも使い回せます。
まずは合計や表示用ラベルなど、よく使う値からth:withに置き換えて、重複を減らしていきましょう。
3. 複数の一時変数を使用する方法
th:withでは、カンマで区切るだけで複数の一時変数をまとめて定義できます。
「小計」と「税額」のように、関連する値を段階的に計算するときにとても便利です。
一度だけ計算しておけば、下の要素で自由に参照できるようになります。
▼ 小計と消費税をまとめて計算してみる
<div th:with="subtotal=${price * quantity}, tax=${subtotal * 0.1}">
<p>商品の価格: <span th:text="${price}"></span>円</p>
<p>購入数: <span th:text="${quantity}"></span></p>
<p>小計: <span th:text="${subtotal}"></span>円</p>
<p>消費税: <span th:text="${tax}"></span>円</p>
<p>合計金額: <span th:text="${subtotal + tax}"></span>円</p>
</div>
最初に小計subtotalを作り、その値を使って消費税taxを計算しています。
こうすることで、price * quantity * 0.1 のような長い式を何度も書かずに済み、
読み手にも計算の流れが伝わりやすくなります。同じテンプレート内での再利用にも強いのが特徴です。
▼ 文字列と数値を混ぜて複数定義する例
<section th:with="title='お会計明細', fee=${subtotal + tax}">
<h4 th:text="${title}" class="fw-bold"></h4>
<p>お支払い総額は <span th:text="${fee}"></span> 円です。</p>
</section>
文字列と数値を並べて定義することもできます。 画面の見出し用文言と計算結果を一緒に管理できるので、 「数字だけ別処理」「文字だけ別処理」という分散を防ぎやすくなります。
複数の一時変数を使うと、式の重複を無くしつつ、テンプレートを読みやすくできるというメリットがあります。 まずは小さな計算から試して、必要な値をまとめて定義する書き方に慣れてみてください。
4. th:withを使用する際の注意点
「4. th:withを使用する際の注意点」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
th:withはとても便利ですが、いくつか気をつけたいポイントがあります。
初心者の方でも戸惑わないように、代表的な注意点をわかりやすく整理してみましょう。
- 一時変数はブロックの中だけで有効
<div>や<section>に設定した一時変数は、そのタグと子要素の中だけで利用できます。 外側のタグでは使えないため、「表示されない?」と思ったらまずスコープを確認してみましょう。 - 変数名はわかりやすく
例えばtよりtotalPriceの方が後から見返したときに理解しやすくなります。 似た名前の変数が多いと混乱するので、商品用・ユーザー用など意味が伝わる名前にするのがおすすめです。 - 複雑な計算はサーバー側で
テンプレート内で重い計算や長い処理を書くと、読みづらくなるだけでなくミスにもつながります。 なるべくコントローラ側で値を用意し、テンプレートでは「仕上げ」程度にとどめると安心です。
▼ スコープを間違えた例(よくある失敗)
<div th:with="msg='こんにちは'">
<p th:text="${msg}"></p>
</div>
<!-- ここではmsgは使えない -->
<p th:text="${msg}"></p>
上の例では、msgは最初のdiv内でだけ有効です。
外側でエラーが出てしまう場合は、変数を使う位置が正しいブロック内かどうかを確認してみると解決できます。
これらのポイントを意識しておけば、画面が複雑になっても安心してth:withを使えます。
「どこで作られた変数か」「どこまで有効か」を意識するだけで、テンプレートの見通しがぐっと良くなります。
5. th:eachとth:withを組み合わせる方法
th:withはth:eachと組み合わせることで、繰り返し処理の中でも活躍します。
商品一覧や会員一覧など、同じレイアウトを何度も表示する画面では、各行ごとに一時変数を作成して利用するとテンプレートが見やすくなります。
毎回同じ式を書く必要がなくなるため、保守もしやすくなります。
▼ 商品ごとに割引価格を計算する例
<tr th:each="item : ${itemList}"
th:with="salePrice=${item.price * 0.9}">
<td th:text="${item.name}"></td>
<td th:text="${item.price}"></td>
<td th:text="${salePrice}"></td>
</tr>
この例では、繰り返しごとにsalePriceという一時変数を作成しています。
割引価格を何度も計算する必要がなくなり、テンプレート全体も読みやすくなります。
商品一覧や注文履歴、会員一覧などの画面でも同じ考え方を利用できます。
▼ 表示用メッセージをまとめて作成する例
<div th:each="user : ${users}"
th:with="message=${user.name} + ' さん'">
<p th:text="${message}"></p>
</div>
一時変数を使えば、文字列の組み立ても一度だけで済みます。 同じ表示内容を複数回利用したい場合でも、テンプレートがすっきりまとまり、修正もしやすくなります。
一覧表示では同じ式を何度も書きがちですが、th:withを利用することで処理内容が整理されます。
特にth:eachと組み合わせる使い方は、Spring BootとThymeleafによるWebアプリケーション開発でよく利用される書き方なので、ぜひ覚えておきましょう。
6. th:ifやth:unlessと組み合わせる方法
th:withで作成した一時変数は、th:ifやth:unlessなどの条件分岐でも利用できます。
一度だけ条件を計算しておけば、その結果を複数の場所で使えるため、テンプレートがシンプルになります。
▼ 在庫があるかどうかを一度だけ判定する
<div th:with="available=${stock > 0}">
<p th:if="${available}">在庫があります</p>
<p th:unless="${available}">在庫切れです</p>
</div>
stock > 0という式は一度だけ評価され、その結果をavailableとして利用しています。
条件式が長くなる場合ほど、一時変数を利用するメリットが大きくなります。
▼ ログイン状態を判定する例
<section th:with="login=${session.loginUser != null}">
<div th:if="${login}">
ログイン中です
</div>
<div th:unless="${login}">
ログインしてください
</div>
</section>
セッション情報などを何度も判定する必要がある場合にも便利です。 一時変数に保存しておけば、画面内の複数箇所で同じ判定結果を利用できます。
条件分岐が多い画面では、同じ条件式が何度も登場することがあります。
そのような場合はth:withで一時変数を作成してから利用すると、テンプレート全体が読みやすくなり、修正漏れも防ぎやすくなります。
7. th:withを使う場面と使わない場面
「7. th:withを使う場面と使わない場面」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
th:withは便利な機能ですが、すべての処理をテンプレート側で行うためのものではありません。
「どのような場面で利用すると効果的なのか」を理解しておくことで、より保守しやすいSpring Bootアプリケーションを作れるようになります。
▼ 利用すると効果的なケース
<div th:with="fullName=${user.lastName + ' ' + user.firstName}">
<h3 th:text="${fullName}"></h3>
<p>担当者:
<span th:text="${fullName}"></span>
</p>
</div>
同じ値を複数回表示する場合には、一時変数を利用すると非常に読みやすくなります。
名前の連結や簡単な計算、表示用の文字列などはth:withとの相性が良い処理です。
▼ 複雑な処理はコントローラ側で行う
<!-- テンプレートでは表示に必要な値だけ利用する -->
<p th:text="${totalPrice}"></p>
大量の計算や複雑な業務ロジックは、Spring Bootのコントローラやサービスクラスで処理するのがおすすめです。
テンプレートでは表示に必要な値だけを受け取り、th:withでは簡単な加工や再利用だけを行うようにすると、役割が明確になります。
th:withは「テンプレート内で少しだけ加工したい」「同じ値を何度も利用したい」という場面で力を発揮します。
一方で、ビジネスロジックまでテンプレートへ書いてしまうと保守が難しくなるため、Spring Bootのコントローラやサービスと役割を分けながら利用することが大切です。
まとめ
本記事では、Thymeleafのth:withについて解説しました。この属性は、一時的な変数を定義してテンプレート内で再利用可能にする便利な機能です。
複雑な計算やデータ加工を簡略化し、テンプレートコードの可読性を高める効果があります。
例えば、合計金額や消費税のように計算が必要なデータを一度計算して一時変数に保存することで、テンプレート内の記述が短縮され、同じ計算を繰り返す必要がなくなります。
また、th:withを複数回使用する場合は、変数名が重複しないように注意しましょう。
以下に改めて簡単な使用例を示します。
<div th:with="discountedPrice=${price * 0.9}">
<p>元の価格: <span th:text="${price}"></span>円</p>
<p>割引後の価格: <span th:text="${discountedPrice}"></span>円</p>
</div>
この例では、priceから10%の割引を計算してdiscountedPriceという変数に保存し、その値を表示しています。このように簡潔な記述が可能になります。
生徒
「th:withを使えば、一時的な変数を定義してテンプレート内で計算結果を再利用できるんですね!」
先生
「そうです。テンプレートコードの見通しを良くするためにも、複雑な処理を一時変数にまとめるのは良い方法です。」
生徒
「複数の変数を同時に使う例もすごく参考になりました!テンプレート内での処理がもっと簡単になりそうです。」
先生
「ぜひ試してみてください。ただし、複雑すぎる計算やデータ加工はサーバーサイドで行うようにすると、コードがより分かりやすくなりますよ。」
生徒
「分かりました!サーバーサイドとの使い分けも意識して活用してみます!」