JSPインクルードディレクティブ、JSPインクルードアクション、およびJSPタグファイルを使用したファイルのインクルードの違いは何ですか?


155

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

<%@ 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>

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

回答:


293

JSP構文要素の概要

最初に、物事をより明確にするために、JSP構文要素の概要を次に示します

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

JSPにコンテンツを含める方法

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

次のJSPのコンテンツを含むように4つのメカニズムはとして分類することができ、直接再利用
(第3の機構のために引用する「ヘッドまずサーブレットおよびJSP」

1)include ディレクティブ

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

Static翻訳時にファイル属性の値から現在のページコンテンツを追加します。このディレクティブは元々、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> URLはWebコンテナの外部からでもかまいません

4)前奏曲とコーダ:

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


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

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

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

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


あなたの編集について

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

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

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

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

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

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

「Pro JSP 2」:JSPカスタムタグの理解からも読んでください。


有用な読書。


結論

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


使用タグファイルの作成の迅速かつ簡単な方法として、カスタムタグあなたが助けることができる再利用可能なコンテンツをカプセル化します

JSPに含まれるコンテンツについて(ここからの引用):

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

しかし、<jsp:include>はタグファイルの使用と同じではありませんか?違いがわかりません...変数をタグファイルに渡すことができるのと同じように、<jsp:include>でインクルードされたファイルに変数を渡すことができます。どちらの方法でもコンテンツを再利用できますが、まったく同じように見えます。名前以外に違いはありますか?
sonicboom 2013

@sonicboom回答を更新
informatik01

1
@ informatik01非常に素晴らしい答え、私は深さ、素晴らしいフォーマット、そして非常に便利な4つのメカニズムのリストに感謝します。
Russell Silva

1
<j @:include>が<* @ include url ..>より優れている点は何ですか?
Krsna Chaitanya 2014年

@KrsnaChaitanya注:*includeディレクティブにタイプミス(アスタリスク)があります。<jsp:include>は標準のインクルードアクション<%@ include file="" %>インクルードディレクティブです。最後のセクション(灰色のボックス内)を読んで、利点(つまり、どちらか一方を選択する場合の推奨事項)の概要を説明します。詳細については、こちらの記事もご覧ください。お役に立てれば。
informatik01

21

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

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

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

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

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

ニーズに応じて、使用する<@include>か、 <jsp:include>


1
あなたはあなたの質問にあなたが示したような意味<t:mytag><h1>Hello World</h1></t:mytag>ですか?これはインクルードではなく、タグの通常の使用方法です(<jsp:useBean>または<c:if>)。
Uooo 2013

タグファイルを使用してページにコンテンツを含めることができるように見えるので、タグファイルとインクルードの使用の違いは何ですか?
sonicboom 2013

9

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

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

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

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


タグファイルについてはどうですか、includesがどのように機能するか知っています。同じ機能を提供しているように見えるので、タグファイルがインクルードにどのように関連しているのだろうと思います。タグファイルの使用とインクルードの使用の違いは何ですか?
sonicboom 2013

どう<%@include file="somefile.jsp?menu=value" %>ですか?それも制限されていますか?
Roshana Pitigala

5

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コードを混在させる必要はありません。


1

によると: Javaの再訪

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.