両方のタグには、あるページのコンテンツが別のページに含まれています。
では、これら2つのタグの正確な違いとは何でしょうか?
再利用可能なコードの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ファイルを実行した後、同じ出力が表示され、directiveとtagの間に違いがあるかどうかを考えます。しかし、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
)で余分なパフォーマンスヒットがあります。つまり、常に最新のコンテンツを使用できることを保証できますが、パフォーマンスコストが増加します。
大きな違いがあります。前述のように、<%@ include
は静的なインクルードであり、<jsp:include
は動的なインクルードです。マクロと関数呼び出しの違いと考えてください(これらの用語に精通している場合)。別の言い方をすれば、静的インクルードは、インクルードファイル(「コード」)の正確なコンテンツを<%@ include
ステートメントの場所にコピーアンドペーストすることとまったく同じです(これは、JSPコンパイラーが行うことです)。
動的なインクルードはrequest(リクエストディスパッチャーを使用)を作成し、指定されたページをexecuteしてから、呼び出しページの出力にページの出力を含めます。 <jsp:include
ステートメントの場所。
ここでの大きな違いは、動的インクルードでは、インクルードされたページが独自のpageContextで実行されることです。また、リクエストであるため、他のリクエストと一緒にパラメータを送信するのと同じ方法で、ページにパラメータを送信できます。一方、静的インクルードは、呼び出しページのコンテキスト内で実行される単なるコードです。同じファイルを複数回静的に含めると、そのファイルのコードは呼び出しページの複数の場所に存在するため、
<%
int i = 0;
%>
(同じ変数を複数回宣言できないため)コンパイラエラーが生成されます。
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のこの質問も参照してください。
1)includeディレクティブを使用する場合
Webアプリの複数のjspで同じ出力ロジックが重複するのを防ぐために、includeメカニズムが使用されます。つまり、プレゼンテーションロジックの再利用を促進するためにincludeディレクティブが使用されます
<%@ include file="abc.jsp" %>
上記の命令がjspエンジンによって受信されると、abc.jspのソースコードを取得し、現在のjspの同じインラインをコピーします。現在のページに対してコピーの翻訳が実行された後
Jspエンジンへの静的な命令であると言うだけです。つまり、「abc.jsp」のソースコード全体が現在のページにコピーされます。
2)アクションを含める?
includeタグは、インクルードされたページのソースコードを現在のページにインクルードしません。代わりに、インクルードされたページによって実行時に生成された出力が現在のページレスポンスに含まれます。
インクルードタグ機能は、サーブレットプログラミングのリクエストディスパッチャのインクルードメカニズムに似ています。
includeタグはjspエンジンへの実行時命令です。つまり、コード全体を現在のページにコピーするのではなく、現在のページから「abc.jsp」へのメソッド呼び出しが行われます
1つは静的インポート(<%= @ include ...> ")、もう1つは動的インポート(jsp:include)です。たとえば、インクルードファイルに指定する必要があるパスに影響します。 Googleで詳しく説明します。