JSPにおけるinclude命令とinclude動作の違い
JSPには2種類のinclude操作形式があり、以下の通りである.
<%@include file="""%>(これは
2つの文法の作用は効果的に全く同じである.前者は命令要素、後者は動作要素である.しかし、パフォーマンスとメンテナンスはまったく異なります.
まず、WEBコンテナがJSPスクリプトをservletファイルに翻訳していることを知っています.次に、サンプルファイルでその違いをさらに理解します.
まず参照されるincludedを作成します.htmlファイル:
<b>to beincluded file</b>
テストindexを作成します.jspファイル:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TEST-JSP</title>
</head>
<body>
<%-- --%>
<%@include file="included.html" %>
<br/>
<jsp:include flush="true" page="included.html"></jsp:include>
</body>
</html>
はい、今配置します.
Webコンテナの配置プロセスにはJSPファイルをservletに翻訳する操作が含まれているため(これらの翻訳の中間ファイルが削除されるかどうかはwebコンテナの設定による)、ここではtomcat 6を例に挙げる.tomcat 6/work/Catalina/localhostのフォルダの下に配置されたプロジェクトが表示され、プロジェクト内のorg/apache/jspフォルダに作成したばかりの文index_も表示されます.jsp.classとindex_jsp.JAva,index_を開くjsp.JAvaでは、以下の内容を見ることができます(webコンテナの翻訳方法は少し異なりますが、ここでは参考にします).ファイルが長いので、その中の_だけを取りました.jspServiceメソッド.
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("<html>
");
out.write(" <head>
");
out.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
");
out.write(" <title>TEST-JSP</title>
");
out.write(" </head>
");
out.write(" <body>
");
out.write(" ");
out.write("
");
out.write(" ");
out.write("<b>to beincluded file</b>");
out.write("
");
out.write(" <br/>
");
out.write(" ");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "included.html", out, true);
out.write("
");
out.write(" </body>
");
out.write("</html>");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
jspファイルはservletのjavaコードに完全に翻訳されていることがわかります.では、先ほど実行した2つの文の翻訳結果を見てみましょう.
out.write("to beincluded file");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "included.html", out, true);
わかる
ここで結論を出すことができます
jsp:includeアクション要素はリクエスト中にアクティブ化され、単独で操作されますが、includeコマンド要素は翻訳段階で処理されており、後でお客様がページにアクセスする速度が速くなります.
しかし、include命令要素はjsp:cludeよりも良いのではないでしょうか.考えてみましょう.引用されたファイルが修正された場合、今どのように処理すればいいですか?間違いなくincludeコマンドを採用したページは、関連するページをすべて再配置する必要があります.問題は、変更したページを参照しているページがあるかどうか分からないことです.逆に,jsp:includeアクション要素を用いたページはまったく影響を受けない.そのため、include命令要素は速いが、メンテナンスに不利であり(設計がよければ、このようなマイナス効果を補うこともできる)、jsp:include動作要素が遅いのは遅いが、メンテナンスが便利であり、現代のサービスにとって、その性能要求は微々たるものと言える.しかし、どのようにするかについては、実際のニーズを見なければなりません.