JSTLコア・ライブラリ - <c:import>タグ

URLベース・リソースのコンテンツをインポートします。

構文1: インライン、またはStringオブジェクトとしてエクスポートされるリソース・コンテンツ

<c:import url=”url” [context=”context ”]
   [var=”varName”] [scope=”{page|request|session|application}”]
    [charEncoding=” charEncoding”]>
 optional body content for <c:param> subtags
</c:import>

構文2: Readerオブジェクトとしてエクスポートされるリソース・コンテンツ

<c:import url=”url” [context=”context ”]
    varReader=”varReaderName
    [charEncoding=” charEncoding”]>
body content where varReader is consumed by another action
</c:import>

ボディ・コンテンツ

JSP。JSPコンテナによってボディ・コンテンツが評価され、現在のJspWriterに結果が書き込まれます。

属性

url
インポートするリソースのURL。
context
外部コンテキストに属する相対URLリソースにアクセスする際のコンテキストの名前。
var
リソースのコンテンツを格納するエクスポート・スコープ変数の名前。スコープ変数の型はStringです。
scope
varのスコープ。
charEncoding
入力リソースのコンテンツの文字コード。
varReader
リソースのコンテンツを格納するエクスポート・スコープ変数の名前。スコープ変数の型はReaderです。

NULLおよびエラーの処理

説明

構文1を使用すると、リソースのコンテンツはデフォルトで現在のJspWriterに書き込まれます。varを指定した場合、リソースのコンテンツはStringオブジェクトとして公開されます。

構文2を使用すると、リソースのコンテンツはReaderオブジェクトとしてエクスポートされます。varReader属性を使用する場合には、いくつかの制限があります。

Readerをエクスポートする場合、<c:import>タグ・ハンドラは、ページの終わりに達するまでにこのReaderが正しくクローズされることを保証する必要があります。このような要件があるため、JSTL 1.0ではエクスポートされたReaderがネストされた可視性を持つよう定義しています。つまり、現在のところ終了タグの後でReaderにアクセスして<c:import>アクションを実行することはできません。JSP 1.2のタグ拡張APIを使用する実装では、<c:import>タグ・ハンドラによってTryCatchFinallyを実装し、エクスポートされたReaderをdoFinally()でクローズすることが必要になる予定です。

また、構文2ではネストされた<c:param>タグを使用できません。公開されたReaderはアクションのボディでただちに使用できる必要があるため、アクションの開始要素の中でリソースへの接続を確立することが必要です。したがって、ネストされた<c:param>アクションでアクセス対象のリソースのURLを変更することは不可能であり、構文2では<c:param>を使用できないことになります。このような状況では、<c:url>を使用して問合せ文字列パラメータを含むURLを作成できます。<c:import>では、必要に応じてセッションID情報が削除されます。

文字コード

<c:import>StringオブジェクトまたはReaderオブジェクトを公開します。どちらのオブジェクトも、バイナリ・データではなく一連のテキスト文字です。入力リソースのコンテンツがバイナリ形式で取得された場合、バイナリ・データがテキスト文字に正しく変換されるように、charEncoding属性を使用して文字コードを指定できます。charEncodingに指定できる値は、JavaクラスInputStreamReaderのコンストラクタに指定できる値と同じです。

文字コードを指定しない場合、次の規則が適用されます。

通常、charEncoding属性が必要なのは、絶対URLリソースにアクセスする際にプロトコルがHTTPではなく、文字コードがISO-8859-1ではない場合のみです。

また、相対URLとHTTPプロトコルを使用する際に、ターゲット・リソースがコンテンツ・エンコーディングを宣言したにもかかわらず、そのエンコーディングでは無効な文字を書き込んだ場合には、その文字の扱いは定義されていません。

相対URLと絶対URL

<c:import>タグの厳密なセマンティクスは、アクセスするURLのタイプによって異なります。

相対URL: 同一コンテキスト

相対URLは、JSP仕様のインクルード・アクション(<jsp:include>)とまったく同様に処理されます。リソースはインクルード先ページと同じWebアプリケーションに属し、相対URLとして指定されます。

JSP仕様に定められているとおり、相対URLはコンテキスト相対パスとページ相対パスのいずれかです。コンテキスト相対パスとは、/で始まるパスです。コンテキスト相対パスは、JSPページの属するアプリケーションに対して相対的に解釈されます。ページ相対パスとは、/で始まらないパスです。ページ相対パスは、JSP仕様の<jsp:include>アクションのインクルードに関するルールで定義されているとおり、現在のJSPページに対して相対的に解釈されます。

同一コンテキストの相対URLで指定したリソースをインポートする際のセマンティクスは、サーブレット仕様に定義されたRequestDispatcherが実行するインクルードと同じです。つまり、ターゲット・リソースはインポート先ページの環境全体(インポート先ページのリクエスト属性とセッション属性、およびリクエスト・パラメータを含む)を使用できます。

相対URL: 外部コンテキスト

リソースは、インポート先ページと同じコンテナに格納された外部コンテキスト(Webアプリケーション)に属します。リソースのコンテキスト名はcontext属性で指定します。

インクルード先ページが同一コンテキストに属していないため、その相対URLはコンテキスト相対とする(/で始める)必要があります。同様に、コンテキスト名も/で始める必要があります。

外部コンテキストの相対URLで指定したリソースをインポートする際のセマンティクスは、サーブレット仕様に定義されたRequestDispatcherが外部コンテキストに対して実行するインクルードと同じです。つまり、ターゲット・リソースはインポート先ページのリクエスト環境のみを使用できます。

外部コンテキストのインポート先リソースはどのコンテナでも使用できるわけではありませんので注意してください。セキュリティを重視した環境では外部コンテキストにアクセスできない場合があります。回避策として、絶対URLを使用して外部コンテキストのリソースにアクセスすることもできます。ただし、相対URLを使用すれば、サーブレットAPIで定義されたRequestDispatcherを使用してリソースにアクセスするため、より効率的です。

相対URL: 問合せパラメータの集約ルール

問合せパラメータの集約ルールは、<jsp:include>に対する場合と同様に機能します。元のパラメータに新しいパラメータが追加され、新しい値は既存の値よりも優先的に適用されます。新しいパラメータのスコープはインポート・コールです。つまり、新しいパラメータ(および値)がインポートの後に適用されることはありません。したがって、動作はサーブレット仕様でRequestDispatcherinclude()メソッドに対して定義された動作と同じです。

絶対URL

絶対URLは、java.net.URLクラスおよびjava.net.URLConnectionクラスで定義されたとおりに取得されます。したがって、<c:import>アクションは少なくともJ2SE 1.2プラットフォームで絶対URL用に提供されているプロトコルをサポートします。Webアプリケーションではそれ以外のプロトコルも使用できますが、これはコンテナが実行されるプラットフォームでWebアプリケーションが使用できるクラス・ライブラリによって異なります。

絶対URLを使用してリソースをインポートする場合、その絶対URLが同じホストとコンテキスト・パスに解決されたとしても、ターゲット・リソースでは現在の実行環境(リクエスト属性やセッション属性など)をまったく使用できません。したがって、インポート先ページのリクエスト・パラメータはターゲットの絶対URLに伝播されません。

HTTPプロトコルを使用して外部リソースをインポートする場合、<c:import>setFollowRedirectsをtrueに設定したjava.net.HttpURLConnectionクラスを介して送信されるGETリクエストのセマンティクスに従って動作します。

注意: JSTL 1.1では、Java Servlet 2.4およびJavaServer Pages 2.0の仕様をサポートするJSPコンテナが必要です。JSTL 1.0仕様の実装には、Java Servlet 2.3およびJavaServer Pages 1.2の仕様をサポートするJSPコンテナが必要です。

JSTLタグの状況依存ヘルプを提供するため、JSTLタグ・ライブラリのドキュメントがApache Software Foundation(http://www.apache.org/)で作成され、JDeveloperに含まれています。また、JSTLタグおよび属性の説明を含む『JavaServer Pages Standard Tag Library 1.0 and 1.1 Specifications』を次のWebサイトからダウンロードできます。

http://www.jcp.org/aboutJava/communityprocess/final/jsr052/index2.html

JSTLの詳細は、次の外部リファレンスを参照してください。

『Java Sun JSTL Resources』ページ:
http://java.sun.com/products/jsp/jstl/

 

JDeveloperのJSTLタグ・ライブラリについて
リファレンス: JavaServer Pages標準タグ・ライブラリ(JSTL)