web-dev-qa-db-ja.com

<jsp:include page = ...>と<%@ include file = ...>の違いは何ですか?

両方のタグには、あるページのコンテンツが別のページに含まれています。

では、これら2つのタグの正確な違いとは何でしょうか?

103
Prasoon

再利用可能なコードの1つではディレクティブ<%@include file="reuse.html"%>を使用し、2番目のコードではtag<jsp:include page="reuse.html" />を使用しています。

再利用可能なファイルのコードを次のようにします。

<html>
<head>
    <title>reusable</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <img src="candle.gif" height="100" width="50"/> <br />
    <p><b>As the candle burns,so do I</b></p>
</body>

両方のJSPファイルを実行した後、同じ出力が表示され、directivetagの間に違いがあるかどうかを考えます。しかし、2つのJSPファイルの生成されたservletを見ると、違いがわかります。directiveを使用すると、次のようになります。

out.write("<html>\r\n");
out.write("    <head>\r\n");
out.write("        <title>reusable</title>\r\n");
out.write("        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("    </head>\r\n");
out.write("    <body>\r\n");
out.write("        <img src=\"candle.gif\" height=\"100\" width=\"50\"/> <br />\r\n");
out.write("        <p><b>As the candle burns,so do I</b></p>\r\n");
out.write("    </body>\r\n");
out.write("</html>\r\n");

これは、2番目のJSPファイルの使用済みタグで確認できます。

org.Apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "reusable.html", out, false);

これで、includeディレクティブは翻訳時にreuse.htmlのソースを挿入しますが、アクションタグは実行時に再利用.htmlの応答を挿入することがわかりました。

考えてみると、すべてのアクションタグ(jsp:include file)で余分なパフォーマンスヒットがあります。つまり、常に最新のコンテンツを使用できることを保証できますが、パフォーマンスコストが増加します。

102
Suhail Gupta

大きな違いがあります。前述のように、<%@ includeは静的なインクルードであり、<jsp:includeは動的なインクルードです。マクロと関数呼び出しの違いと考えてください(これらの用語に精通している場合)。別の言い方をすれば、静的インクルードは、インクルードファイル(「コード」)の正確なコンテンツを<%@ includeステートメントの場所にコピーアンドペーストすることとまったく同じです(これは、JSPコンパイラーが行うことです)。

動的なインクルードはrequest(リクエストディスパッチャーを使用)を作成し、指定されたページをexecuteしてから、呼び出しページの出力にページの出力を含めます。 <jsp:includeステートメントの場所。

ここでの大きな違いは、動的インクルードでは、インクルードされたページが独自のpageContextで実行されることです。また、リクエストであるため、他のリクエストと一緒にパラメータを送信するのと同じ方法で、ページにパラメータを送信できます。一方、静的インクルードは、呼び出しページのコンテキスト内で実行される単なるコードです。同じファイルを複数回静的に含めると、そのファイルのコードは呼び出しページの複数の場所に存在するため、

<%
int i = 0;
%>

(同じ変数を複数回宣言できないため)コンパイラエラーが生成されます。

53
pap

jGur

<%@include file="abc.jsp"%>ディレクティブは、Cの"#include"のように動作し、インクルードファイルのテキストを取り込み、インクルードファイルの一部であるかのようにコンパイルします。含まれるファイルには、任意のタイプ(HTMLまたはテキストを含む)を使用できます。

<jsp:include page = "abc.jsp">タグは、ファイルを個別のJSPファイルとしてコンパイルし、コンパイルされたJSPに呼び出しを埋め込みます。

一部のJSPエンジンは、非標準タグ<!--#include file="data.inc"-->(NCSAまたは.shtmlスタイル)および<%@ vinclude="data.inc" %>(JRunスタイル)をサポートしていますが、これらはJSP仕様で定義されていないため、信頼できません。

JSP FAQのこの質問も参照してください。

37

1)includeディレクティブを使用する場合

Webアプリの複数のjspで同じ出力ロジックが重複するのを防ぐために、includeメカニズムが使用されます。つまり、プレゼンテーションロジックの再利用を促進するためにincludeディレクティブが使用されます

  <%@ include file="abc.jsp" %>

上記の命令がjspエンジンによって受信されると、abc.jspのソースコードを取得し、現在のjspの同じインラインをコピーします。現在のページに対してコピーの翻訳が実行された後

Jspエンジンへの静的な命令であると言うだけです。つまり、「abc.jsp」のソースコード全体が現在のページにコピーされます。

2)アクションを含める

includeタグは、インクルードされたページのソースコードを現在のページにインクルードしません。代わりに、インクルードされたページによって実行時に生成された出力が現在のページレスポンスに含まれます。

インクルードタグ機能は、サーブレットプログラミングのリクエストディスパッチャのインクルードメカニズムに似ています。

includeタグはjspエンジンへの実行時命令です。つまり、コード全体を現在のページにコピーするのではなく、現在のページから「abc.jsp」へのメソッド呼び出しが行われます

28
Ajay Takur

1つは静的インポート(<%= @ include ...> ")、もう1つは動的インポート(jsp:include)です。たとえば、インクルードファイルに指定する必要があるパスに影響します。 Googleで詳しく説明します。

1
talnicolas

Java再訪

  1. Includeディレクティブに含まれるリソースはjsp変換時にロードされ、includeアクションに含まれるリソースはリクエスト時にロードされます。
  2. Includeディレクティブの場合、jspファイルが再びコンパイルされるまで、含まれるリソースの変更は表示されません。 includeアクションの場合、含まれるリソースの変更は次のリクエストで表示されます。
  3. Includeディレクティブは静的インポートですが、includeアクションは動的インポートです
  4. Includeディレクティブはfile属性を使用して含まれるリソースを指定し、includeアクションは同じ目的でpage属性を使用します。