159

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>

では、どの方法を使用すればよいでしょうか。1 つが非推奨と見なされていますか、それとも両方とも有効であり、さまざまなユース ケースをカバーしていますか?

編集

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

// 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>

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

4

5 に答える 5

300

JSP 構文要素の概要

まず、物事をより明確にするために、JSP 構文要素の簡単な概要を次に示します。

  • ディレクティブ: JSP ページ全体に関する情報を伝達します。
  • スクリプト要素: これらは、宣言、式、スクリプトレット、コメントなどの Java コーディング要素です。
  • オブジェクトスコープ: JSP オブジェクトは、明示的または暗黙的に作成でき、JSP ページまたはセッションのどこからでも、特定のスコープ内でアクセスできます。
  • アクション: オブジェクトを作成するか、JSP 応答の出力ストリームに影響を与えます (またはその両方)。

JSP へのコンテンツの組み込み方法

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

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

1) インクルードディレクティブ:

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

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

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

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

動的: ページ属性の値のコンテンツをリクエスト時に現在のページに追加します。JSP からの動的コンテンツを対象としていました。

3) <c:import>JSTL タグ:

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

Dynamic :リクエスト時に、URL 属性の値から現在のページにコンテンツを追加します。によく似て <jsp:include>いますが、より強力で柔軟性があります。他の 2 つのインクルードとは異なり、<c:import> URL は Web Container の外部から取得できます

4) 前奏曲とコーダ:

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


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

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

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

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


あなたの編集について

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

  • 呼び出しページから渡された属性によってカスタマイズされます。

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

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

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

  • 相互にネストされ、プライベート変数によって通信します。

また、「Pro JSP 2」: Understanding JSP Custom Tagsからもお読みください。


役に立つ読書。


結論

各タスクに適切なツールを使用してください。

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

JSPでのインクルードコンテンツについては(ここから引用):

  • ファイルがめったに変更されない場合は、include ディレクティブを使用します。最速のメカニズムです。コンテナーが変更を自動的に検出しない場合は、メイン ページ クラス ファイルを削除することで、強制的に変更を有効にすることができます。
  • include アクションは、頻繁に変更されるコンテンツに対してのみ使用し、メイン ページがリクエストされるまでどのページを含めるかを決定できない場合にのみ使用します。
于 2013-02-08T00:35:01.957 に答える
23

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

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

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

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

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

必要に応じて、<@include>または <jsp:include>

于 2013-01-29T10:26:52.667 に答える
9

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

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

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

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

于 2013-02-07T20:18:35.937 に答える
6

<%@include><jsp:include>およびの 3 つのテンプレート オプション<%@tag>はすべて有効であり、3 つすべてが異なるユース ケースをカバーしています。

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

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

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

タグ ファイルは、(JSP 2.0 より前の) Java コードを使用して記述しなければならなかったタグ ライブラリを記述するための、より単純な JSP ベースのメカニズムです。タグで多くのレンダリングを行う必要がある場合は、JSP タグ ファイルを記述する方がはるかに簡潔です。Java でタグを記述した場合のように、Java コードと HTML コードを混在させる必要はありません。

于 2013-02-08T06:52:18.550 に答える
1

によると: Java Revisited

  1. include ディレクティブによって含まれるリソースは jsp 変換時にロードされますが、include アクションによって含まれるリソースはリクエスト時にロードされます。

  2. include ディレクティブの場合、含まれているリソースの変更は、jsp ファイルが再度コンパイルされるまで表示されません。include アクションの場合、含まれるリソースの変更は次のリクエストで表示されます。

  3. インクルード ディレクティブは静的インポートですが、インクルード アクションは動的インポートです。

  4. インクルード ディレクティブはファイル属性を使用して含めるリソースを指定しますが、インクルード アクションは同じ目的でページ属性を使用します。

于 2013-10-18T06:34:13.147 に答える