技術空間

JSP

JSPの静的インクルードと動的インクルードの違い


TOP > JSP > JSPの静的インクルードと動的インクルードの違い



■静的インクルードと動的インクルードの違い

JSPのインクルードには静的インクルード動的インクルードがある。それぞれの記述形式は以下のとおり。

方式記述形式
静的<%@ include file="include.jsp" %>
動的<jsp:include page="include.jsp" />

静的インクルード

JSPのコンパイル時(サーブレット変換時)にインクルード先のコードをインクルード元のコードに埋め込む。(ソースのマージ)

(イメージ図)

ソースをマージするため、以下の特徴がある。


動的インクルード

実行時にインクルード先へ処理を委譲し、出力結果を動的にマージする。サーブレットで使用するRequestDispatcherのinclude(request, response)と同等。

(イメージ図)

ソースが別々になるため、以下の特徴がある。


サンプル

静的インクルードと動的インクルードの両方使用して、出力結果を見てみる。

test.jspinclud1e.jspinclude2.jspをそれぞれ静的、動的でインクルードする。

test.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

サンプルのJSPがサーブレットに変換された実際のソースを見てみる。tomcatの場合、一時フォルダに以下のファイルが生成されている。

生成されたファイル
test_jsp.java      ←インクルード元のサーブレット(java)
test_jsp.class     ←インクルード元のサーブレット(class)
include2_jsp.java  ←動的インクルードJSPのサーブレット(java)
include2_jsp.class ←動的インクルードJSPのサーブレット(class)

test_jsp.javainclude2_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に全く干渉しない。

test_jsp.java(抜粋)
      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>"); ←動的インクルードのコード


TOP > JSP > JSPの静的インクルードと動的インクルードの違い

Tweet ̃Gg[͂ĂȃubN}[Nɒlj
技術空間