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動作要素が遅いのは遅いが、メンテナンスが便利であり、現代のサービスにとって、その性能要求は微々たるものと言える.しかし、どのようにするかについては、実際のニーズを見なければなりません.