web-dev-qa-db-ja.com

JSP includeディレクティブ、JSP includeアクション、およびJSPタグファイルの使用にファイルを含めることの違いは何ですか?

JSPでテンプレート化する方法は2つあるようです。これらのステートメントのいずれかを含むファイルを含める

<%@ include file="foo.html" %>
<jsp:include page="foo.html" />

またはJSPタグファイルを使用する

// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
    <jsp:doBody/>
</body>
</html>

そして、別のJSPページでそれを呼び出す

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:mytag>
    <h1>Hello World</h1>
</t:mytag>

それで、どの方法を使うべきですか?現在は非推奨とみなされていますか、それとも有効であり、さまざまなユースケースをカバーしていますか?

編集

このタグファイルは、インクルードの使用と同じではありませんか?

// Save this as product.tag
<%@ tag description="Product templage" pageEncoding="UTF-8"%>
<%@ tag import="com.myapp.Product" %>
<%@ attribute name="product" required="true" type="com.myapp.Product"%>

Product name: ${product.name} <br/>
Quantity: ${product.quantity} <br/>

そして、別のJSPでそれを呼び出します

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:product>
    <c:forEach items="${cart.products}" var="product">
        <t:product product="${product}"/>
    </c:forEach>
</t:product>

これは、インクルードを使用してパラメーターを渡すのとまったく同じように思えます。タグファイルはインクルードと同じですか?

149
sonicboom

JSPファイルのコンテンツを再利用するためのメカニズムがいくつかあります。

次のJSPにコンテンツを含める4つのメカニズムは、直接再利用に分類できます。
"Head First Servlets and JSP" から引用した最初の3つのメカニズムの場合)

1)includeディレクティブ:

<%@ include file="header.html" %>

静的:ファイル属性の値からコンテンツを現在のページに追加します翻訳時。このディレクティブはもともと、HTMLヘッダーなどの静的レイアウトテンプレートを対象としていました。

2)<jsp:include>標準アクション:

<jsp:include page="header.jsp" />

動的:ページ属性の値から現在のページにコンテンツを追加します要求時に。 JSPからの動的コンテンツをより意図したものです。

3)<c:import> JSTLタグ:

<c:import url=”http://www.example.com/foo/bar.html” />

動的:URL属性の値から現在のページにコンテンツを追加します要求時に。これは<jsp:include>と非常によく似ていますが、より強力で柔軟性があります。他の2つのインクルードとは異なり、<c:import>RLはWebコンテナの外部からでもかまいません

4)プレリュードとコーダ:

静的:プレリュードとコーダページの最初と最後にのみ適用できます
<include-prelude>要素と<include-coda>要素をそれぞれ<jsp-property-group>に追加することにより、JSPページのグループにpreludes(ヘッダーとも呼ばれます)およびcodas(フッターとも呼ばれます)を暗黙的に含めることができますWebアプリケーションweb.xmlデプロイメント記述子の要素。詳細はこちら:
JSPの開始時と終了時の暗黙的なインクルードの設定
暗黙的インクルードの定義


タグファイルは、間接的な方法コンテンツの再利用、再利用可能なコンテンツのカプセル化の方法です。 タグファイルは、カスタムタグとして再利用可能なJSPコードのフラグメントを含むソースファイルです。

インクルードとタグファイルの目的は異なります。

タグファイル (JSP 2.0で導入された概念)は、オプションの1つですカスタムタグを作成するためのカスタムタグを構築するより速くて簡単な方法です。 カスタムタグ は、タグ拡張とも呼ばれ、他のJavaコンポーネントによって提供されるカスタムロジックと出力をJSPページに挿入できるJSP要素です。カスタムタグを介して提供されるロジックは、タグハンドラとして知られるJavaオブジェクトによって実装されます。

カスタムタグで実行できるタスクの例には、暗黙オブジェクトの操作、フォームの処理、データベースや電子メールやディレクトリなどのエンタープライズサービスへのアクセス、フロー制御の実装が含まれます。


編集について

たぶんあなたの例(あなたのEdit)で、直接インクルードとタグファイルの使用に違いはありません。ただし、カスタムタグには豊富な機能セットがあります。彼らはできる

  • 呼び出しページから渡される属性を使用してカスタマイズします。

  • 変数を呼び出しページに返します。

  • JSPページで使用可能なすべてのオブジェクトにアクセスします。

  • 互いに通信します。 JavaBeansコンポーネントを作成および初期化し、1つのタグでそのBeanを参照するパブリックEL変数を作成してから、そのBeanを別のタグで使用できます。

  • 互いにネストし、プライベート変数を使用して通信します。

「Pro JSP 2」からもこれをお読みください: JSPカスタムタグについて


有用な読書。


結論

各タスクに適切なツールを使用します。


タグファイルカスタムタグをすばやく簡単に作成し、再利用可能なコンテンツをカプセル化するのに役立ちます。

JSPにコンテンツを含める場合( here からの引用):

  • includeディレクティブを使用ファイル変更がほとんどないの場合。最速のメカニズムです。コンテナが変更を自動的に検出しない場合は、メインページクラスファイルを削除して、変更を強制的に有効にすることができます。
  • includeアクションを使用頻繁に変更されるのコンテンツに対してのみ、およびメインページが要求されるまでどのページを含めるかを決定できない場合。
280
informatik01

重複する可能性のある質問

<@include>-ディレクティブタグは、生成されたサーブレットコードを作成する前に、含まれているファイルの内容をJSPにマージするようJSPコンパイラーに指示します。これは、インクルードページのテキストをJSPにカットアンドペーストするのと同じです。

  • 実行時に実行されるサーブレットは1つだけです。
  • 親ページで宣言されたスクリプトレット変数は、含まれているページでアクセスできます(これらは同じページであることに注意してください)。
  • 含まれるページは、スタンドアロンJSPとしてコンパイルできる必要はありません。コードフラグメントまたはプレーンテキストにすることができます。含まれるページがスタンドアロンとしてコンパイルされることはありません。含まれているページには任意の拡張子を付けることもできますが、.jspfは従来から使用されている拡張子になりました。
  • 古いコンテナの1つの欠点は、親ページが更新されるまで、インクルードページの変更が有効にならない場合があることです。 Tomcatの最近のバージョンでは、インクルードページの更新を確認し、更新されている場合は親の再コンパイルを強制します。
  • さらなる欠点は、コードが生成されたサーブレットのサービスメソッドに直接インライン化されるため、メソッドが非常に大きくなる可能性があることです。 64 KBを超えると、JSPコンパイルが失敗する可能性があります。

<jsp:include>-一方、JSP Actionタグは、このページの実行を一時停止し、含まれているページを実行し、そのページの出力をこのページの出力にマージするようにコンテナに指示します。

  • 含まれる各ページは、実行時に個別のサーブレットとして実行されます。
  • 実行時にページを条件付きで含めることができます。これは、インクルードからページを構築するテンプレートフレームワークに役立つことがよくあります。親ページは、実行時の条件に応じて、どのページを含めるかを決定できます。
  • スクリプトレット変数の値は、インクルードページに明示的に渡す必要があります。
  • 含まれるページは、単独で実行できる必要があります。
  • 生成されたサーブレットクラスで最大メソッドサイズを超えているため、コンパイルエラーが発生する可能性は低くなります。

ニーズに応じて、<@include>または<jsp:include>を使用できます

21
Darth

<jsp:include />に対する<%@ include >の主な利点は次のとおりです。

<jsp:include />はパラメーターを渡すことができます

<jsp:include page="inclusion.jsp">
    <jsp:param name="menu" value="objectValue"/>
</jsp:include>

<%@include file="somefile.jsp" %>では不可能です

8
Saurabh Ande

3つのテンプレートオプション(<%@include><jsp:include><%@tag>)はすべて有効であり、3つすべてが異なるユースケースに対応しています。

<@include>を使用すると、JSPパーサーはコンパイル前にインクルードファイルのコンテンツをJSPにインライン化します(Cの#includeと同様)。このオプションは、単純な静的コンテンツで使用します。たとえば、Webアプリのすべてのページにヘッダー、フッター、またはナビゲーション要素を含める場合。含まれるコンテンツはコンパイルされたJSPの一部になり、実行時に追加費用は発生しません。

<jsp:include>(およびJSTLの<c:import>は、類似しており、さらに強力です)は、動的コンテンツに最適です。これらは、ローカルまたはリモートの別のURLのコンテンツを含める必要がある場合に使用します。含めるリソース自体が動的な場合。または、インクルードされたコンテンツが、インクルードページと競合する変数またはBean定義を使用している場合。 <c:import>を使用すると、含まれているテキストを変数に格納することもでき、これをさらに操作または再利用できます。どちらもディスパッチに追加のランタイムコストがかかります。これは最小限ですが、動的インクルードが「無料」ではないことに注意する必要があります。

再利用可能なユーザーインターフェイスコンポーネントを作成する場合は、タグファイルを使用します。たとえば、ウィジェットのリストがあり、ウィジェットを反復処理し、それぞれのプロパティを(テーブルまたはフォームで)表示する場合は、タグを作成します。タグは、<%@tag attribute>を使用して引数を取ることができ、これらの引数は、メソッドパラメーターのように必須またはオプションのいずれかです。

タグファイルは、JSPベースのよりシンプルなタグライブラリ記述メカニズムであり、(JSP 2.0より前)Javaコードを使用して記述する必要がありました。タグで行うレンダリングが多い場合、JSPタグファイルを作成する方がはるかにクリーンです。Javaでタグを記述した場合のようにJavaとHTMLコードを混在させる必要はありません。 。

5
Hari

Java再訪

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