タイトル: include
SEOタイトル: JSP include (jsp:include / @include) 完全ガイド
| この記事の要点 |
|
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;
%>
<%= pageTitle %>
Site Header
<%-- 親 JSP --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ include file="common/header.jsp" %>
Main Content
Year: <%= year %>
<%-- header.jsp の変数を使える --%>
<%@ include file="common/footer.jsp" %>
特徴:
- コンパイル時に親 JSP の本文にそのまま展開される
- 変数 / メソッド / インポートを共有
- 1 つの Servlet にコンパイルされるので高速
- include 先を編集しても親が再コンパイルされない (古い内容のまま) ことがある → クリーンビルド必要
動的 include:
<%-- 親 JSP --%>
<%@ page contentType="text/html; charset=UTF-8" %>
Main Content
<%-- common/header.jsp --%>
<%
String pageTitle = request.getParameter("pageTitle");
String year = request.getParameter("year");
%>
[<%= year %>] <%= pageTitle %>
特徴:
- 実行時に取り込み先 JSP を実行し、出力結果 (HTML) だけを取り込む
- 取り込み先は独立した Servlet なので変数共有不可
でパラメータ渡し- 動的に取込先を切替可能 (
page="${url}") - 静的 include より若干オーバーヘッドあり
2 種類の使い分け早見表
| 項目 | 静的 @include | 動的 jsp:include |
|---|---|---|
| 処理タイミング | コンパイル時 | リクエスト時 |
| 変数共有 | ★ できる | できない |
| パラメータ渡し | 不可 | ★ jsp:param で可 |
| 取込ファイル動的指定 | 不可 (リテラル必須) | ★ ${url} で可 |
| 性能 | ★ 速い | 少し遅い |
| 再コンパイル | 取込先変更時に親も要 | 独立して反映 |
| 主用途 | 共通宣言 / 定数 | ヘッダ / フッタ / ウィジェット |
JSTL
JSTL の はさらに高機能で、外部 URL も取り込めます:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 内部 JSP を取り込み --%>
<%-- 外部 URL を取り込み (RSS, REST) --%>
${feed}
<%-- 文字コード指定 --%>
<%-- 取り込み内容を変数に --%>
Apache Tiles (現在 EOL)
Struts 1 系で「テンプレートエンジン」として広く使われた Apache Tiles も include を抽象化していました。共通レイアウトと「穴埋めパーツ」を分離できますが、2017 年に Apache が End of Life を宣言。新規採用は非推奨です:
Sitemesh
Sitemesh は「逆テンプレート」方式: 子ページが title / body を持ち、Sitemesh が後付けでレイアウトを合成。Tiles より導入が軽く、シンプルなプロジェクトでよく使われました:
/*
Site Header
モダン代替: Thymeleaf
Spring Boot 等で現在主流のテンプレートエンジンが Thymeleaf。include 相当は th:insert / th:replace / th:fragment:
Default
| 属性 | 動作 |
|---|---|
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 は古いプロジェクト保守用と割り切る方が良い。