| この記事の要点 |
|
JSP の include 概要
JSP / Servlet 系の Web アプリでヘッダ / フッタ / サイドバーなど共通部品を別 JSP に切り出して取り込む仕組みです。Struts 1.x / 2.x、素の JSP、JSF いずれでも使われてきました。
取り込み方は大きく分けて 静的 (コンパイル時) と 動的 (実行時) の 2 種類があり、用途と挙動が異なります。
静的 include: <%@ include file="..." %>
<%-- common/header.jsp --%>
<%
String pageTitle = "Welcome";
int year = 2026;
%>
<!DOCTYPE html>
<html><head><title><%= pageTitle %></title></head><body>
<header>Site Header</header>
<%-- 親 JSP --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ include file="common/header.jsp" %>
<h1>Main Content</h1>
<p>Year: <%= year %></p> <%-- header.jsp の変数を使える --%>
<%@ include file="common/footer.jsp" %>
特徴:
- コンパイル時に親 JSP の本文にそのまま展開される
- 変数 / メソッド / インポートを共有
- 1 つの Servlet にコンパイルされるので高速
- include 先を編集しても親が再コンパイルされない (古い内容のまま) ことがある → クリーンビルド必要
動的 include: <jsp:include page="..." />
<%-- 親 JSP --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<html><body>
<jsp:include page="common/header.jsp">
<jsp:param name="pageTitle" value="Welcome" />
<jsp:param name="year" value="2026" />
</jsp:include>
<h1>Main Content</h1>
<jsp:include page="common/footer.jsp" />
</body></html>
<%-- common/header.jsp --%>
<%
String pageTitle = request.getParameter("pageTitle");
String year = request.getParameter("year");
%>
<header>[<%= year %>] <%= pageTitle %></header>
特徴:
- 実行時に取り込み先 JSP を実行し、出力結果 (HTML) だけを取り込む
- 取り込み先は独立した Servlet なので変数共有不可
<jsp:param>でパラメータ渡し- 動的に取込先を切替可能 (
page="${url}") - 静的 include より若干オーバーヘッドあり
2 種類の使い分け早見表
| 項目 | 静的 @include | 動的 jsp:include |
|---|---|---|
| 処理タイミング | コンパイル時 | リクエスト時 |
| 変数共有 | ★ できる | できない |
| パラメータ渡し | 不可 | ★ jsp:param で可 |
| 取込ファイル動的指定 | 不可 (リテラル必須) | ★ ${url} で可 |
| 性能 | ★ 速い | 少し遅い |
| 再コンパイル | 取込先変更時に親も要 | 独立して反映 |
| 主用途 | 共通宣言 / 定数 | ヘッダ / フッタ / ウィジェット |
JSTL <c:import>
JSTL の <c:import> はさらに高機能で、外部 URL も取り込めます:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 内部 JSP を取り込み --%>
<c:import url="/common/header.jsp">
<c:param name="pageTitle" value="Welcome" />
</c:import>
<%-- 外部 URL を取り込み (RSS, REST) --%>
<c:import url="https://api.example.com/feed.xml" var="feed" />
${feed}
<%-- 文字コード指定 --%>
<c:import url="/common/header.jsp" charEncoding="UTF-8" />
<%-- 取り込み内容を変数に --%>
<c:import url="/common/sidebar.jsp" var="sidebarHtml" />
<aside>${sidebarHtml}</aside>
Apache Tiles (現在 EOL)
Struts 1 系で「テンプレートエンジン」として広く使われた Apache Tiles も include を抽象化していました。共通レイアウトと「穴埋めパーツ」を分離できますが、2017 年に Apache が End of Life を宣言。新規採用は非推奨です:
<!-- tiles-defs.xml -->
<tiles-definitions>
<definition name="layout" template="/WEB-INF/layout/main.jsp">
<put-attribute name="title" value="Default Title"/>
<put-attribute name="header" value="/WEB-INF/parts/header.jsp"/>
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/parts/footer.jsp"/>
</definition>
<definition name="user.list" extends="layout">
<put-attribute name="title" value="User List"/>
<put-attribute name="body" value="/WEB-INF/jsp/user/list.jsp"/>
</definition>
</tiles-definitions>
Sitemesh
Sitemesh は「逆テンプレート」方式: 子ページが title / body を持ち、Sitemesh が後付けでレイアウトを合成。Tiles より導入が軽く、シンプルなプロジェクトでよく使われました:
<!-- WEB-INF/decorators.xml -->
<decorators defaultdir="/decorators">
<decorator name="main" page="main.jsp">
<pattern>/*</pattern>
</decorator>
</decorators>
<!-- decorators/main.jsp -->
<html>
<head><title><decorator:title default="Default" /></title></head>
<body>
<header>Site Header</header>
<main><decorator:body /></main>
<footer>Site Footer</footer>
</body>
</html>
モダン代替: Thymeleaf
Spring Boot 等で現在主流のテンプレートエンジンが Thymeleaf。include 相当は th:insert / th:replace / th:fragment:
<!-- templates/fragments/header.html -->
<header th:fragment="siteHeader (pageTitle)">
<h1 th:text="${pageTitle}">Default</h1>
</header>
<!-- 利用側 -->
<div th:insert="~{fragments/header :: siteHeader('Welcome')}"></div>
<!-- div の内側に挿入 -->
<div th:replace="~{fragments/header :: siteHeader('Welcome')}"></div>
<!-- div ごと置換 -->
| 属性 | 動作 |
|---|---|
th:fragment | 再利用ブロックを宣言 |
th:insert | 呼び出し側タグの内側に挿入 |
th:replace | 呼び出し側タグごと置換 (推奨) |
th:include | fragment の中身だけ挿入 (Thymeleaf 3 で非推奨) |
FAQ
Q: 静的と動的、どちらを使うべき?
A: 動的 (jsp:include) が無難。変数共有が必要な定数だけ静的に。
Q: 取り込み先の変更が反映されない
A: 静的 include で起きがちな問題。work/Catalina 配下の生成 Servlet を削除 → 再起動。
Q: include したいファイルが WEB-INF 下にある
A: 直接 URL アクセスできなくとも JSP 内 jsp:include page="/WEB-INF/parts/header.jsp" で取り込めます。Tomcat はこれを許可。
Q: 新規プロジェクトでも JSP include を使うべき?
A: 新規なら Spring Boot + Thymeleaf 推奨。JSP は古いプロジェクト保守用と割り切る方が良い。
子ページはありません
- include
- taglib
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15