カテゴリ: Thymeleaf 更新日: 2026/10/06

Thymeleafのth:hrefの使い方を全解説。初心者でも完璧に理解できるガイド

Thymeleafのth:hrefの使い方
Thymeleafのth:hrefの使い方

先生と生徒の会話形式で理解しよう

生徒

「ThymeleafでURLを設定するにはどうすればいいですか?」

先生

「Thymeleafではth:href属性を使うことで、HTMLのタグに実行URLを設定できますよ。」

生徒

「実際に使うとどうなるのか教えてください!」

先生

「じゃあ、実際のコードを見ていきましょう。」

1. th:hrefとは?

1. th:hrefとは?
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の基本な使い方

2. 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. 変数やパラメータの流入方法

3. 変数やパラメータの流入方法
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の実行結果

4. th:hrefの実行結果
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の生成(検索・一覧で必須のパターン)

5. クエリパラメータ付き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エンコード済みで出力されます。スペースや日本語も自動で安全な文字に変換されます。

6. @を使わずに文字連結で動的リンクを作る(相対/絶対パスのコツ)

6. @を使わずに文字連結で動的リンクを作る(相対/絶対パスのコツ)
6. @を使わずに文字連結で動的リンクを作る(相対/絶対パスのコツ)

学習目的で、@{...}を使わずに文字連結でリンクを作る方法も押さえておきましょう。 文字列補間(|...|)や+演算子でURLを組み立てられますが、 URLエンコードやコンテキストパス付与は自動ではありません。実運用は@{...}推奨、 ここでは仕組み理解のための最小例に絞ります。


<!-- 文字列補間:読みやすい -->
<a th:href="|/user/${user.id}|">ユーザ詳細へ</a>

<!-- + 演算子:慣れている人向け -->
<a th:href="${'/user/' + user.id}">ユーザ詳細へ</a>

<!-- クエリを自力で結合(& は &amp; に) -->
<a th:href="|/search?q=${keyword}&amp;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>

7. 条件付きリンクとアクセシビリティ(内部リンク最適化のベストプラクティス)

7. 条件付きリンクとアクセシビリティ(内部リンク最適化のベストプラクティス)
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を自動生成するために使います。省略することも可能ですが、推奨は@付きです。
関連記事:
カテゴリの一覧へ
新着記事
New1
Spring
Spring Bootの@RequestParamの使い方を解説!初心者でもわかるGETリクエストのパラメータ取得
更新記事
New2
Java
JavaのLocalDateTime.formatメソッドを完全解説!初心者でもわかる日時フォーマット入門
更新記事
New3
Java
Javaのラムダ式とStreamのfilterを徹底解説!初心者でもわかる条件による絞り込み処理
更新記事
New4
Servlet
JavaのServletExceptionクラスを初心者向けに徹底解説!
更新記事
人気記事
No.1
Java&Spring記事人気No1
Servlet
JavaサーブレットのdoPostメソッドとは?初心者向けにやさしく解説!
No.2
Java&Spring記事人気No2
Servlet
JavaのHttpServletRequestWrapperとgetSessionメソッドの使い方を徹底解説!初心者向けServletのセッション管理入門
No.3
Java&Spring記事人気No3
Servlet
JavaのServletExceptionクラスを初心者向けに徹底解説!
No.4
Java&Spring記事人気No4
Servlet
JavaのHttpServletResponseクラスを初心者向けに徹底解説!
No.5
Java&Spring記事人気No5
Java
JavaのStringクラスとlengthメソッドを完全解説!初心者でも理解できる文字列の長さ取得の使い方
No.6
Java&Spring記事人気No6
Servlet
JavaのHttpSessionAttributeListenerとattributeRemovedメソッドの使い方を徹底解説!初心者でもわかるセッション属性の削除と監視
No.7
Java&Spring記事人気No7
Java
Javaのクラスとインスタンス化、コンストラクタの使い方完全ガイド!初心者でもわかるオブジェクト指向の基礎
No.8
Java&Spring記事人気No8
Servlet
JavaのHttpSessionインターフェースとgetSessionContextメソッドを徹底解説!初心者でもわかるセッション管理の基本