Thymeleafのth:hrefの使い方を全解説。初心者でも完璧に理解できるガイド
生徒
「ThymeleafでURLを設定するにはどうすればいいですか?」
先生
「Thymeleafではth:href属性を使うことで、HTMLのタグに実行URLを設定できますよ。」
生徒
「実際に使うとどうなるのか教えてください!」
先生
「じゃあ、実際のコードを見ていきましょう。」
1. th:hrefとは?
Thymeleafのth:hrefは、HTMLのタグに設定するhref属性を
サーバー側の値で安全に置き換えるための属性です。テンプレート上では
<a th:href="...">と書き、画面に表示される直前(サーバーでのレンダリング時)に
実際のURLへと変換されます。これにより、アプリのコンテキストパス(アプリ配下のベースURL)を自動で考慮しつつ、
手動の文字連結ミスやパス違いを防げます。
<!-- まずは一番やさしい例:トップページに戻るリンク -->
<a th:href="@{/}">トップへ戻る</a>
上の例では、@{/}が「アプリのルート(トップ)」を指します。
本番環境や開発環境でURLの前に付くパスが違っても、th:hrefなら自動で合わせてくれるため、
初心者でも同じテンプレートをそのまま使い回せます。まずは「固定の場所へ戻るリンク」を
th:hrefで置き換えるところから始めると理解しやすいでしょう。
2. th:hrefの基本な使い方
まずは「固定の場所へリンクする」一番シンプルなパターンから始めます。
th:hrefの中で@{...}という書き方(URL式)を使うと、
テンプレートを表示する直前にタグのhrefへ安全に差し込まれます。
基本は「アプリ内のパスをそのまま書く」だけです。
<!-- トップ/ホームなど、固定ページへのリンク -->
<a th:href="@{/home}">ホームに戻る</a>
<!-- ルート(トップ)へ戻る -->
<a th:href="@{/}">トップへ</a>
<!-- 階層があるページへ移動 -->
<a th:href="@{/products/list}">商品一覧へ</a>
<!-- ボタン風のリンク(Bootstrap を利用) -->
<a class="btn btn-primary" th:href="@{/contact}" role="button">お問い合わせ</a>
ポイントは次の2つです。①@{...}の中には「アプリ内のパス」をそのまま書く。
②hrefとth:hrefを同時に書かない(th:hrefが最終的な値を決めるため、基本はth:hrefだけにする)。
これだけで、開発環境と本番環境でパスが違っても自動で整えてくれるので、初心者でも迷いにくくなります。
まずはこの形で、固定ページへのリンクをth:hrefに置き換えてみましょう。
3. 変数やパラメータの流入方法
th:hrefでは、URLの一部をプレースホルダ({...})として書き、
右側の丸かっこで実データを対応付けるだけで、リンク先を動的に作れます。難しく考えず、
「左で型紙を作って、右で値をはめ込む」と覚えるとスッと入ります。
<!-- 基本:1つのIDをURLに流し込む -->
<a th:href="@{/user/{id}(id=${user.id})}">ユーザページ</a>
上記は、/user/{id}の{id}に${user.id}を入れて
最終的に/user/123のようなリンクを作ります。丸かっこの中は
「URL側の名前 = テンプレートの値」という並びで書きます。
<!-- 複数のプレースホルダを同時に埋める例 -->
<a th:href="@{/users/{uid}/orders/{oid}(uid=${user.id}, oid=${order.id})}">
注文詳細へ
</a>
複数あっても手順は同じです。左の{uid}・{oid}に、
右側でそれぞれ${user.id}・${order.id}を対応付けます。
値は画面表示前に自動で差し込まれるため、文字連結のミスやスラッシュ抜けを避けられます。
<!-- 固定パスと動的部分の混在(読み物系のスラッグなど) -->
<a th:href="@{/articles/{slug}(slug=${post.slug})}">この記事を読む</a>
文字列でも同じ要領でOKです。プレースホルダはURLの一部を安全に置き換える仕組みなので、 まずは「IDやスラッグをはめ込む」用途から使ってみましょう。なお、値が用意できない場合は リンクが成立しないため、値がある前提の場面で使うのが基本です。
4. th:hrefの実行結果
テンプレートはサーバーで処理され、ブラウザには完成したhrefだけが届きます。
そのため、画面の「ページのソース」を見てもth:hrefは残らず、通常のタグになります。
下の例で「テンプレート → 実際のHTML」の変化を確認してみましょう。
<!-- テンプレート(user.id = 123 の場合) -->
<a th:href="@{/user/{id}(id=${user.id})}">ユーザページ</a>
<!-- 実際のHTML(ブラウザに届く状態) -->
<a href="/user/123">ユーザページ</a>
同様に、固定パスもレンダリング後は通常のリンクになります。
アプリのコンテキストパスが/appなら、結果は/app/から始まります。
<!-- テンプレート -->
<a th:href="@{/}">トップへ戻る</a>
<!-- 実際のHTML -->
<a href="/">トップへ戻る</a>
<!-- 例:コンテキストパスが /app のときは /app/ になります -->
まとめると、th:hrefは「テンプレート上の指定」を「最終的な正しいURL」に変換します。
仕上がりだけがブラウザに送られるので、利用者は普通のリンクとして安心してクリックできます。
5. クエリパラメータ付きURLの生成(検索・一覧で必須のパターン)
クエリパラメータは、URLの末尾に付く?q=...や&page=...の部分です。
th:hrefでは@{...}の丸かっこの中に「キー=値」を並べるだけでOK。
文字エンコードや? / &の連結は自動処理されるので、手作業のミスを避けられます。
<!-- 基本:検索語・ページ番号・並び順を付ける -->
<a th:href="@{/search(q=${keyword}, page=${page}, sort=${sort})}">
検索結果へ
</a>
<!-- よくある絞り込み:カテゴリと在庫フラグ -->
<a th:href="@{/items(category=${category}, inStock=${inStock})}">
条件で絞り込む
</a>
<!-- 配列(複数選択)もOK:tag=A&tag=B という形で展開 -->
<a th:href="@{/articles(tag=${selectedTags})}">タグで探す</a>
生成例:キーワードが「スマホ」、page=2、sort=priceなら
/search?q=%E3%82%B9%E3%83%9E%E3%83%9B&page=2&sort=price のように
URLエンコード済みで出力されます。スペースや日本語も自動で安全な文字に変換されます。
nullや空の値はパラメータ自体が自動で省略されます(例:pageが未設定ならpage=は付かない)。
さらに@{...}はアプリのコンテキストパスも自動考慮するため、本番と開発でベースURLが違っても同じテンプレートを安全に使い回せます。
6. @を使わずに文字連結で動的リンクを作る(相対/絶対パスのコツ)
学習目的で、@{...}を使わずに文字連結でリンクを作る方法も押さえておきましょう。
文字列補間(|...|)や+演算子でURLを組み立てられますが、
URLエンコードやコンテキストパス付与は自動ではありません。実運用は@{...}推奨、
ここでは仕組み理解のための最小例に絞ります。
<!-- 文字列補間:読みやすい -->
<a th:href="|/user/${user.id}|">ユーザ詳細へ</a>
<!-- + 演算子:慣れている人向け -->
<a th:href="${'/user/' + user.id}">ユーザ詳細へ</a>
<!-- クエリを自力で結合(& は & に) -->
<a th:href="|/search?q=${keyword}&page=${page}|">検索へ</a>
<!-- 絶対URLへ飛ばす例(外部サイト) -->
<a th:href="${'https://example.com/u/' + user.id}" target="_blank" rel="noopener">外部プロフィール</a>
相対/絶対パスのコツ:
・先頭が/なら「サイトルートからの絶対パス」。例:/products/list
・先頭に./や../を付けると「今いる場所からの相対パス」。例:../detail
・外部サイトに飛ばすならhttps://...で完全なURLを書く。
<!-- 相対パスの例:現在 /products/ の時に 1つ上へ -->
<a th:href="'../list'">一覧に戻る</a>
<!-- ルートからの絶対パス -->
<a th:href="'/products/list'">商品一覧</a>
/app の場合、文字連結では自分で付ける必要があります。
例:|/app/user/${user.id}|。迷ったら、コンテキストを自動考慮する@{...}を使うのが安全です。
&のHTMLエスケープ(&)を忘れがちです。
日本語・スペース・記号を含む場合は特に不具合になりやすいため、基本は@{...}での生成を優先しましょう。
7. 条件付きリンクとアクセシビリティ(内部リンク最適化のベストプラクティス)
SEOでは内部リンクの品質が重要です。th:ifやth:unlessを使えば、
データが未設定のときに「クリックできないダミーリンク」を避けられます。ユーザ体験(UX)やアクセシビリティの観点でも有効です。
<!-- user が存在する時だけ実リンク、なければテキスト -->
<a th:if="${user != null}" th:href="@{/user/{id}(id=${user.id})}">ユーザ詳細へ</a>
<span th:unless="${user != null}" aria-disabled="true" class="text-muted">ユーザ詳細へ(未選択)</span>
<!-- 在庫なしならボタン風リンクを無効化(視覚的+意味的配慮) -->
<a th:href="@{/cart/add(id=${item.id})}"
th:attrappend="aria-disabled=${!item.inStock}"
th:classappend="${!item.inStock} ? ' disabled' : ''"
role="button">カートに入れる</a>
クリック不可状態を明示し、誤クリックや離脱を防止することで、サイト回遊性やコンバージョンの改善にもつながります。
まとめ
この記事では、Thymeleafにおけるth:hrefの基本的な使い方から応用的な設定まで解説しました。th:hrefを使うことで、サーバーサイドのデータやパラメータをリンクに組み込むことができ、効率的に動的なURLを生成できます。
初心者でも理解しやすいように、サンプルコードとその実行結果を見ながら説明しました。
具体的には、次のポイントを理解していただけたと思います:
th:href属性を使うことで、HTMLタグにサーバーサイドのURLやデータを指定できる。- 変数やパラメータを組み込むことで、動的なURLの生成が可能。
- Thymeleafではコンテキストパスを
@{}を使って指定することが推奨されている。
以下に簡単なサンプルコードで復習してみましょう。
<a th:href="@{/product/{id}(id=${product.id})}">商品ページへ</a>
上記のコードでは、動的に商品IDをth:hrefに渡し、URLを生成しています。Thymeleafを活用することで、テンプレートエンジンをより柔軟に使うことが可能です。
生徒
「th:hrefを使うと、動的にURLを設定できるんですね!」
先生
「その通りです。パラメータや変数も渡せるので、複数のユーザーページや商品ページを簡単に生成できます。」
生徒
「それなら、毎回手動でURLを書かなくても済みますね!」
先生
「そうですね。Thymeleafは効率的にテンプレートを作成できるので、ぜひ使いこなしてください。」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Thymeleafのth:hrefって何ですか?HTMLのhrefとの違いは?
Thymeleafのth:hrefは、Spring Bootなどのサーバーサイドアプリケーションで動的にURLを生成するための属性です。HTMLのhrefは静的なリンクですが、th:hrefは変数やパラメータを使ってURLを動的に作成できます。
Thymeleafでth:hrefを使ったリンクの基本的な書き方が知りたいです。
基本的には、th:href="@{/home}" のように書きます。@記号はアプリケーションのコンテキストパスを含むURLを生成するための記号で、HTMLのaタグと組み合わせて使用します。
th:hrefでURLに変数を渡す方法は?ユーザーIDなどを埋め込みたいです。
URLパスに変数を埋め込むには、@{/user/{id}(id=${user.id})} のように書きます。これは、{id}の部分にuser.idの値を埋め込む仕組みで、REST形式のURL生成に便利です。
th:hrefでクエリパラメータ(?q=〇〇)の書き方がよくわかりません。
クエリパラメータは、@{/search(q=${keyword}, page=${page})} のように指定できます。これにより、安全にURLエンコードされたリンクが生成されます。
th:hrefの中で @ を使う意味は何ですか?必須ですか?
@はThymeleafがコンテキストパス付きのURLを自動生成するために使います。省略することも可能ですが、推奨は@付きです。
ChatGPTなどの生成AIをこれから学びたい方に向けて、AIスキルアカデミーの口コミ・評判、料金、無料セミナーの内容を詳しくまとめています。
AIスキルアカデミーの口コミ・評判を詳しく見る