JSPのインクルードには静的インクルードと動的インクルードがある。それぞれの記述形式は以下のとおり。
方式 | 記述形式 |
---|---|
静的 | <%@ include file="include.jsp" %> |
動的 | <jsp:include page="include.jsp" /> |
JSPのコンパイル時(サーブレット変換時)にインクルード先のコードをインクルード元のコードに埋め込む。(ソースのマージ)
(イメージ図)
ソースをマージするため、以下の特徴がある。
実行時にインクルード先へ処理を委譲し、出力結果を動的にマージする。サーブレットで使用するRequestDispatcherのinclude(request, response)と同等。
(イメージ図)
ソースが別々になるため、以下の特徴がある。
静的インクルードと動的インクルードの両方使用して、出力結果を見てみる。
test.jspでinclud1e.jspとinclude2.jspをそれぞれ静的、動的でインクルードする。
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta charset="UTF-8">
<title>テスト</title>
</head>
<body>
<%@ include file="include1.jsp" %><-- 静的インクルード -->
<jsp:include page="include2.jsp" /><-- 動的インクルード -->
test=<%=test %><-- test変数を出力してみる -->
</body>
</html>
include1.jsp(静的インクルードJSP)
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<% String test = "test1";%><-- test変数を宣言 -->
static include<br><-- リテラル文字列出力 -->
include2.jsp(動的インクルードJSP)
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<% String test = "test2";%><-- test変数を宣言 -->
dynamic include<br><-- リテラル文字列出力 -->
上記のtest.jspをブラウザで表示すると、以下のように出力される。
static include ←①静的インクルードの内容
dynamic include ←②動的インクルードの内容
test=test1 ←③静的インクルードの内容
①静的インクルードによって「static include」が出力される。
②動的インクルードによって「dynamic include」が出力される。
③静的インクルードの変数値「test1」が出力される。インクルード元の<%=test %>には静的インクルードのtest変数が代入される
サンプルのJSPがサーブレットに変換された実際のソースを見てみる。tomcatの場合、一時フォルダに以下のファイルが生成されている。
test_jsp.java ←インクルード元のサーブレット(java)
test_jsp.class ←インクルード元のサーブレット(class)
include2_jsp.java ←動的インクルードJSPのサーブレット(java)
include2_jsp.class ←動的インクルードJSPのサーブレット(class)
test_jsp.javaとinclude2_jsp.javaのコードを見てみる。
test_jsp.javaの中を見てみると、静的インクルードのinclude1.jspは完全にtest.jspのコードの一部になっているのがわかる(ソースのマージ)。 従ってinclude1_jsp.java、include1_jsp.classは存在しない。 1つのコードになるため、include1.jspで定義したtest変数をtest.jspで参照できる。
一方、動的インクルードであるinclude2.jspは完全に別のJava(include2_jsp.java)になっている。 test.jspからはinclude2.jspへ処理を委譲しているだけである。 そのため、include2.jspで定義したtest変数はtest.jspに全く干渉しない。
out.write("\r\n");
out.write("<!DOCTYPE>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"UTF-8\">\r\n");
out.write("<title>テスト</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write('\r');
out.write('\n');
String test = "test1"; ←静的インクルードのコード
out.write("\r\n");
out.write("static include<br>"); ←静的インクルードのコード
out.write('\r');
out.write('\n');
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "include2.jsp", out, false); ←動的インクルードへ処理委譲
out.write("\r\n");
out.write("test=");
out.print(test ); ←静的インクルードに定義していた変数を出力
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
include2_jsp.java(抜粋)
out.write('\r');
out.write('\n');
String test = "test2"; ←動的インクルードのコード
out.write("\r\n");
out.write("dynamic include<br>"); ←動的インクルードのコード