Thymeleafでヘッダーを共通化

Thymeleafでヘッダーを共通化

Thymeleafでヘッダーを共通化するためには、フラグメントを使うと便利です。
以下にヘッダーを共通化するためのサンプルコードを示します。

1. header.html(ヘッダー部分のフラグメントファイル)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>共通ヘッダー</title>
</head>
<body>
  <div th:fragment="commonHeader">
    <header>
      <h1>サイトのタイトル</h1>
      <nav>
        <ul>
          <li><a href="/">ホーム</a></li>
          <li><a href="/about">アバウト</a></li>
          <li><a href="/contact">コンタクト</a></li>
        </ul>
      </nav>
    </header>
  </div>
</body>
</html>

2. 他のHTMLファイルで共通ヘッダーをインクルードする

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>ページタイトル</title>
</head>
<body>
  <div th:include="::commonHeader"></div>
  <main>
    <h2>ページコンテンツ</h2>
    <p>ここにページ固有の内容が入ります。</p>
  </main>
</body>
</html>

これにより、header.htmlに定義したヘッダー部分を他のHTMLファイルで共通して利用することができます。
変更が必要な場合は、header.htmlを編集するだけで全てのページに反映されます。

インクルードの際に引数を設定する場合

Thymeleafでフラグメントに引数を渡すには、th:with属性を使います。
以下に、引数を使ったヘッダーの共通化の例を示します。

1. header.html(ヘッダー部分のフラグメントファイル)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>共通ヘッダー</title>
</head>
<body>
  <div th:fragment="commonHeader(title, navigation)">
    <header>
      <h1 th:text="${title}">サイトのタイトル</h1>
      <nav>
        <ul>
          <li th:each="navItem : ${navigation}">
            <a th:href="${navItem.href}" th:text="${navItem.text}">リンク</a>
          </li>
        </ul>
      </nav>
    </header>
  </div>
</body>
</html>

2. 他のHTMLファイルで共通ヘッダーをインクルードする際に引数を設定する

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>ページタイトル</title>
</head>
<body>
  <div th:include="::commonHeader" 
       th:with="title='マイページ', 
                navigation=${navigationList}">
  </div>
  <main>
    <h2>ページコンテンツ</h2>
    <p>ここにページ固有の内容が入ります。</p>
  </main>
</body>
</html>

3. コントローラーでナビゲーションリストを設定する(例:SpringBoot)

@Controller
public class MyController {

  @GetMapping("/mypage")
  public String myPage(Model model) {
    List<Map<String, String>> navigationList = new ArrayList<>();
    navigationList.add(Map.of("href", "/", "text", "ホーム"));
    navigationList.add(Map.of("href", "/about", "text", "アバウト"));
    navigationList.add(Map.of("href", "/contact", "text", "コンタクト"));

    model.addAttribute("navigationList", navigationList);
    return "mypage"; // mypage.htmlを表示
  }
}

これにより、各ページで異なるタイトルやナビゲーションメニューを動的に設定することができます。