|
Thymeleafのヘッダー/フッター共通化
Spring Boot+Thymeleafで複数のページのHTMLのヘッダー/フッター部分を共通テンプレート化する方法には、大きく分けて
があります。
簡単に言うと、複数のHTMLページの中に共通部分を埋め込むのが前者、
逆に共通のHTMLレイアウトの中に複数ページの固有部分を埋め込むのが後者です。
ここでは後者の Thymeleaf Layout Dialect を使う方法をまとめています。
[1] pom.xmlの追記
pom.xmlに Thymeleaf Layout Dialect を使用するための記述を追加します。
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
|
ちなみに build.gradle の場合はdependenciesに以下を追加します。
dependencies {
// (略)
mplementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
// (略)
}
|
[2] Controllerクラスを作る
サンプルなのでごくごく簡単に、/test にアクセスしたらテンプレート test.html を表示するだけのControllerクラスを作ります。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LayoutTestController {
@RequestMapping("/test")
String action() {
return "test";
}
}
|
[3] テンプレート layout.html を作る
アプリケーションのルートから、src/main/resources/templates/layout/layout.html
となる位置にレイアウトのテンプレートとなるファイルを作ります。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>[[${title}]]</title>
<link href="/css/default.css" th:href="@{/css/default.css}" rel="stylesheet"></link>
</head>
<body>
<table border="0" width="100%" cellpadding="0" cellspacing="0">
<tr><td style="text-align:left; vertical-align:bottom; font-weight:bold;">[[${pgmid}]] | Ver 1.0</td></tr>
</table>
<table border="0" width="100%" bgcolor="0000ff">
<tr><td style="text-align:center; font-weight:bold; font-size:medium; color:#ffffff">[[${title}]]</td></tr>
</table>
<div layout:fragment="content"></div>
<form th:action="@{/backtomain}">
<input type="submit" value="メインメニューに戻る" />
</form>
</body>
</html>
|
枠線をTABLE要素で記述しており、今の時代となってはあまり良いサンプルではありませんね…(-_-)
それはさておき、この
<div layout:fragment="content"></div>
|
の部分が、後述の内容部分を差し込まれて置き換わります。
また、このテンプレートには ${pgmid} と ${title} というパラメータ(変数)が渡されています。渡す側の記述は後述します。
なお、このlayout.htmlの中に、さらにヘッダー、フッター、サイドバー部分…と個別にテンプレートを取り込む記述も可能ですが、
ここでは省略します。
[4] 各ページの内容部分を作る
最後に、本来の各ページごとに表示する内容部分のページです。
今回の例ではこれが test.html になります。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
layout:decorate="~{layout/layout(pgmid='STNP002',title='レイアウトのサンプル')}">
<body>
<div layout:fragment="content">
ここからメインページ<br>
<div>
***
</div>
ここまでメインページ<br>
</div>
</body>
</html>
|
この
<div layout:fragment="content">
...
</div>
|
の部分が、先ほどのlayout.htmlの
<div layout:fragment="content"></div>
|
に置き換わります。両方とも全く同じ要素名なので混乱しますが、そういうものなので仕方がない……
また、取り込むレイアウトファイルは通常
layout:decorate="~{layout/layout}"
|
のように書きますが、ここをサンプルのように
layout:decorate="~{layout/layout(pgmid='STNP002',title='レイアウトのサンプル')}"
|
と書くと、テンプレートにパラメータを渡すことができます。
ここで定義した値がテンプレート側の [[${pgmid}]] や [[${title}]] の位置に表示される動作になります。

(first uploaded 2024/08/05 last updated 2026/07/22, URANO398)
|