Oracle9iAS Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス リリース9.0.3 部品番号 J06903-01 |
|
このトピックでは、OC4Jが提供するJESI(ESI for Java)タグ・ライブラリについて説明します。これらのタグは、Oracle9iAS Web Cacheで使用可能なEdge Side Includes(ESI)フレームワークの最上部で稼働して、JSPアプリケーションにESIキャッシング機能を提供します。
このトピックには、次の項目が含まれます。
Webキャッシングの概要と、Oracle9iAS Web Cache、Oracle9i Application Server Java Object CacheおよびOC4J Web Object Cacheの説明は、「Webアプリケーションに対するOracleキャッシング・サポートのサマリー」を参照してください。
この項では、Oracle JESIタグの基礎となっている基本テクノロジの一部に関するバックグラウンド情報について説明します。
JESIタグは、JSPページの動的コンテンツをキャッシュ可能なコンポーネントに分割します。その基礎となるのがEdge Side IncludesアーキテクチャとESIマークアップ言語です。
JESIタグの使用は、特定のESIプロセッサやキャッシング・システムに依存しているわけではありませんが、Oracleユーザーのほとんどは、Oracle9iAS Web CacheとそのESIプロセッサを使用しているものと思われます。
次の項目について説明します。
この項で説明するのは、ESIアーキテクチャと言語の簡単な概要のみです。ESIテクノロジに関する追加情報は、次のWeb サイトを参照してください。
http://www.edge-delivery.org
この項では、ESIテクノロジの特性とESIのサロゲートの概念を紹介します。
Edge Side Includesとは、XMLスタイルのマークアップ言語のことです。この言語によって、Web サーバーから独立して、ネットワークの「edge」で動的コンテンツのアセンブリを実行できます。また、この言語は、Webキャッシュやコンテンツ配信ネットワーク(CDN)など、現在使用可能なツールを活用して、エンド・ユーザーのパフォーマンスを向上させるために設計されています。
ESIには、中間段階の処理を促進することによって、Webサーバーとアプリケーション・サーバーのロードを軽減する手段が含まれています。サロゲートまたはリバース・プロキシと呼ばれるこの手段は、ESI言語を理解し、Webサーバーにかわって動作します。ESIコンテンツの目的は、Webサーバーを離れてから、エンド・ユーザーのブラウザに表示されるまでの間の処理を行うことにあります。サロゲートは、HTTPヘッダーを介してコマンド実行されます。したがって、サロゲートをESIプロセッサと呼ぶことができます。また、Webキャッシュの機能の一部に含めることもできます。
ESIは、Webページの各動的部分を個別にキャッシュし、適切に切り離して取得できるパーシャル・ページのキャッシング方法論に近いと言えます。
ESIマークアップ・タグを使用すると、開発者は集計Webページを定義できます。また、必要に応じて、ESIプロセッサで取得およびアセンブルするキャッシュ可能コンポーネントを定義できます。集計ページは、エンド・ユーザーが指定したURLに関連付けられているリソースと考えることができます。簡単に言えば、ESIタグに指定されている指示を含むアセンブリ用のコンテナです。
サロゲートは、ページ・コンテンツを所有するWebサーバーのかわりに動作するため、コンテンツ所有者は、サロゲートの動作を完全に制御できます。これにより、サロゲートを使用しない場合に比較して、大幅なパフォーマンスの向上が可能になります。
サロゲートでのキャッシング処理は、HTTPでのキャッシング処理に全体的に類似しています。どちらも、類似した斬新な妥当性チェック機能を基盤として使用しています。ただし、サロゲートには、その上に制御機能も備わっています。
ESI言語のバージョン1.0には、次の主要な機能が含まれています。
ESIプロセッサは、ネットワークから取得された動的コンテンツのフラグメントを、集計ページにアセンブルして、ユーザーに出力します。各フラグメントには、独自のメタデータがあり、そのフラグメントのキャッシング動作を制御できます。
ESIは、HTTPのリクエスト属性に基づく変数の使用をサポートしています。ESI文では、処理時に変数を使用することも、その変数を処理済のマークアップに直接出力することもできます。
ESIでは、ページの処理方法の判断に、条件付きロジックのブール比較を使用できます。
一部のESIタグは、デフォルト・リソースまたは代替リソース(あるいはその両方)の指定をサポートしています。代替リソースには、プライマリ・リソースが検出できなかった場合の代替Webページなどがあります。
この項では、Oracle9iAS Web CacheとそのESIプロセッサを紹介します。詳細は、『Oracle9iAS Web Cache管理および配置ガイド』を参照してください。
Oracleでは、Webサイトのパフォーマンスの問題を抱えるE-Businessを支援するために、Oracle9iAS Web Cacheを提供しています。この製品は、コンテンツ対応のサーバー・アクセラレータ、つまりリバース・プロキシ・サーバーであり、Oracle9i Application Server上で稼働するWebサイトのパフォーマンス、拡張性および可用性を向上させます。
Oracle9iAS Web Cacheでは、頻繁にアクセスするURLのページをメモリーに格納することによって、アプリケーションWebサーバー上でこれらのURLに対するリクエストを繰り返して処理する必要がなくなります。静的ドキュメントのみを処理するレガシー・プロキシ・サーバーとは異なり、Oracle9iAS Web Cacheは、1つ以上のアプリケーションWebサーバーから、静的コンテンツと動的に生成されたコンテンツの両方をキャッシュします。キャッシュ・ヒットの数が増えるほど、レガシー・プロキシの場合に比較して、パフォーマンス強化が増大し、アプリケーション・サーバーへの負荷が減少します。
概念的には、Oracle9iAS Web Cacheは、アプリケーションWebサーバーの前に位置しており、Webサーバーのコンテンツをキャッシュし、そのコンテンツをリクエストしているWebブラウザに送信します。Webサイトへのアクセス時に、Webブラウザは、HTTPプロトコルまたはHTTPSプロトコルのリクエストをOracle9iAS Web Cacheに送信します。その結果、このWeb Cacheは、アプリケーションWebサーバーに対する仮想サーバーとして動作します。リクエストされたコンテンツがすでに失効の場合、またはアクセスできない場合、Oracle9iAS Web Cacheは、そのアプリケーションWebサーバーから新規コンテンツを取得します。
次に、ブラウザとOracle9iAS Web Cacheとの典型的な相互作用のステップを示します。
このリクエストの結果、ドメイン・ネーム・システム(DNS)に対して、WebサイトのIPアドレスのリクエストが生成されます。
Oracle9iAS Web Cacheには、Edge Side Includesマークアップ言語の使用をサポートするESIプロセッサが組み込まれています。(詳細は、「Edge Side Includesテクノロジ」を参照してください。)
Oracle9iAS Web Cache環境のWeb開発者は、自分のアプリケーションでESI言語を直接使用できます。ただし、JSP開発者の場合は、様々な理由から、ESI言語に対する便利なJSPインタフェースとして提供されているJESIタグ・ライブラリを使用します。「JESIタグのメリット」を参照してください。
この項では、JESI機能とOracleによる実装について説明します。次の項目が含まれます。
次のWebサイトからJESIの提案仕様にアクセスできます。
http://www.edge-delivery.org
OC4Jでは、JESIタグ・ライブラリを、ESIタグとWebキャッシングに関するEdge Side Includes機能への便利なインタフェースとして提供しています。開発者は、WebアプリケーションでESIタグを直接使用できますが、JESIタグは、JSP環境で使用したほうがはるかに便利です。次に、ESIタグを直接使用せずに、JESIタグを使用する主なメリットについて説明します。
JSPページの使用またはJSP IDE環境での作業に習熟している開発者は、JESIタグによって、JSPプログラミングの使い慣れた便利な機能を使用できます。たとえば、完全なURLやファイル・パスではなく、ページ相対URL構文やアプリケーション相対URL構文によってインクルード・ページを参照できます。
JESIタグは、メタデータ情報(キャッシュ内のページの期限切れなど)の指定、必要に応じたページの明示的な失効化、およびCookie情報を使用したページのパーソナライズなどに使用する便利な構文とタグ属性をサポートしています。
JESIタグ・ライブラリでは、アプリケーション・レベルの構成ファイルを使用して、特定の環境に適したデプロイ時パラメータとアプリケーションのデフォルト設定を簡単に指定できます。このようにして、多様なニーズを持つ様々な環境にデプロイし、アプリケーション・コードを変更せずに、適切なデフォルトを設定できます。たとえば、このような構成ファイルを使用して、失効化リクエストに対して、キャッシュ・サーバーのURL、ユーザー名およびパスワードを事前に設定できます。
OracleがJESIを実装するレイヤーは、標準ESIフレームワークの最上部です。JESIタグ・ライブラリは、標準実装であるため、次の点に注意してください。
Oracle JESIタグ・ライブラリは、次のタグをサポートします。
control
、JESI include
、JESI template
およびJESI fragment
invalidate
(およびサブタグ)
personalize
JSP開発者は、対応するESIタグ(esi:include
など)ではなく、これらのタグ(JESI include
など)を使用します。このタグの有用性と利便性については、「JESIタグのメリット」で説明しています。
注意: Oracle JESIタグ・ライブラリは、標準ライブラリです。標準JavaServer Pagesタグ・ライブラリのフレームワークに関する一般情報は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。 |
集計ページとそのキャッシュ可能コンポーネントの定義にJESIタグを使用する方法には、次の2つのモデルがあります。
この項では、これら2つのモデルについて説明し、最後にJESI include
タグに関する特記事項を説明します。
JESIタグの使用方法の1つは、モジュール化された方法です。この方法では、ほとんど(またはすべて)のキャッシュ可能コンテンツをインクルード・ページとして集計ページに表示します。通常、このモデルは、次のように使用します。
control
タグをトップレベルのページで使用し、必要に応じて、インクルード・コンテンツ以外のコンテンツにキャッシング・パラメータを設定します。
include
タグを使用して、動的コンテンツをインクルードします。
control
タグを各インクルード・ページ内で使用し、必要に応じて、これらのページにキャッシング・パラメータを設定します。
このドキュメントでは、このモジュール化された方法を、control/includeモデルと呼びます。この方法は、新規ページを開発する場合に特に便利です。
各インクルード・ファイルは、個別のキャッシュ可能オブジェクトです(ただし、タグ設定によってキャッシングを失効化できます)。また、集計ページの追加コンテンツもすべて個別オブジェクトです。
状況によっては、両タグともオプションになります。ページには、JESI control
タグを、JESI include
タグなしで指定できます。実際に、これが既存のページをJESI用に変換する簡単な方法です。また、JESI include
タグを使用しているページに、必ずしもJESI control
タグを指定する必要はありません。
JESI control
タグによる指定がないページ(トップレベルのページかインクルード・ページであるかに関係なく)がキャッシュ可能かどうかは、ESIプロセッサの構成設定によって決まります。これは、ページにJESI control
タグがない場合、またはページにcache
属性の設定がないJESI control
タグがある場合にも適用されます。
注意: 集計ページのJESI |
タグ構文と例は、次の各項を参照してください。
もう1つのJESIタグの使用方法は、コンテンツが集計ページ自体にある場合で、必要に応じてページを独立したキャッシュ可能なフラグメントに分割する方法です。JESI template
タグを使用して、すべてのキャッシュ可能なコンテンツの集計を囲みます。このタグはフラグメント以外の集計ページにキャッシング・パラメータを設定します。集計内のフラグメントを個別にキャッシュするように定義するには、必要に応じて、JESI fragment
タグを使用します。
このドキュメントでは、この使用方法をtemplate/fragmentモデルと呼びます。この方法は、既存ページをJESI用に変換する場合に特に便利です。JESI include
タグも、テンプレート・レベルまたはフラグメント・レベルのいずれかで必要に応じて使用できます。
JESI template
タグとJESI fragment
タグは、必ず同時に使用します。ページに個別のフラグメントが不要な場合は、JESI template
ではなく、JESI control
を使用します。
各フラグメントは個別のキャッシュ可能なオブジェクトです。フラグメント以外のテンプレート・レベルの動的コンテンツも個別のキャッシュ可能オブジェクトです。すべてのインクルード・ページも個別のキャッシュ可能オブジェクトです。フラグメント以外のテンプレート・コードがキャッシュ可能かどうかは、JESI template
タグのcache
属性の設定(設定されている場合)によって決まります。フラグメントがキャッシュ可能かどうかは、JESI fragment
タグのcache
属性の設定(設定されている場合)によって決まります。インクルード・ページがキャッシュ可能かどうかは、そのページ内のJESI control
タグのcache
属性の設定(設定されている場合)によって決まります。cache
属性の設定がないテンプレート、フラグメントまたはインクルード・ページがキャッシュ可能かどうかは、ESIプロセッサの設定によって決まります。
テンプレートとフラグメントは、独立したキャッシュ可能オブジェクトであるため、ESIプロセッサで期限切れになる時点が異なる場合があります。キャッシュ・ミスの発生時、または期限切れオブジェクトがリクエストされたとき、ESIプロセッサは、Webサーバー(Oracle9iASの場合はOC4J)に新しいコピーをリクエストします。リクエストされたオブジェクトがJESIテンプレートの場合、JSPエンジンは、テンプレート・コード、つまり、そのページ内のフラグメントを除くすべてのコードを実行します。JSPトランスレータは、生成した出力に、フラグメントをインクルードする場所を指定するESIマークアップを配置します。この時点では、JESIフラグメントに格納されているコードは実行されません。
フラグメントが期限切れになると、ESIプロセッサはWebサーバーに対して、その特定のフラグメントをリクエストします。フラグメントを実行するために、OC4J JSPコンテナは、テンプレート・コード(フラグメント以外のすべてのコード)に加えて、リクエスト対象のフラグメントのコードを実行します。結果ページには、テンプレートの出力、他のフラグメントをインクルードするためのESIマークアップおよびリクエストされたフラグメントの結果が含まれます。これらのフラグメントの結果は、適切な時点でページに挿入(インライン)されます。レスポンスを受信すると、ESIプロセッサは、ページ内のインライン・フラグメントを検出し、そのフラグメントの更新済コピーをキャッシュします。Oracle ESIプロセッサは、ページの残りの部分を廃棄します。(他のESIプロセッサでは、動作が異なる場合があります。)Oracle9iAS Web Cacheは、新しいフラグメントのリクエスト時にテンプレートを更新しません。
テンプレートとフラグメントに対して期限切れポリシーを選択するときは、この動作に注意してください。ページをテンプレートとフラグメントに正確かつ効率的に分割するためには、特定の更新リクエスト時にどの部分のJSPページが実行されるのかを記憶しておくことが重要です。たとえば、テンプレート・コードは、更新リクエストのたびに実行されるため、毎回実行が必要な場合を除いては、コストのかかる計算をテンプレート・レベルに配置しないようにしてください。通常、コストのかかる計算は、できるだけ期限切れ期間が長いフラグメントに配置することをお薦めします。
同一リクエスト時に、2つのフラグメントは実行されないことにも注意してください。したがって、スクリプトレット変数の値を1つのフラグメントで宣言または設定して、別のフラグメントで依存させることは避けてください。1つの変数が2つ以上のフラグメントで必要な場合は、テンプレート・コードで宣言および設定してください。同様に、それほど断定的ではありませんが、1つのフラグメント内にリクエスト属性またはセッション属性を設定し、それを別のフラグメントに読み込むことは避けてください。このような、グローバルなページ・ロジックは、テンプレート・レベルに配置してください。
タグ構文と例は、次の各項を参照してください。
いずれのモデルを使用する場合も、JESI include
文については、次の点に注意してください。
include
文を含むページをインクルードしたJESI include
文、またはJESI fragment
によって定義されたフラグメント内のJESI include
文として、サポートされています。
たとえば、後者の場合、ESIプロセッサは、最初に集計ページのコンテンツを、次にフラグメントのコンテンツを、最後にそのフラグメント内のインクルード・ページのコンテンツをリクエストします。
include
とjsp:include
は概念的には似ていますが、キャッシング用にJSPページを変換するときに、JESI include
は、jsp:include
の完全な代替とはなりません。ESIプロセッサでは、別々のHTTPリクエストを使用するため、HTTPのリクエストまたはレスポンス・オブジェクトを集計ページとJESI include
タグでインクルードされたページとの間で渡すことができません。インクルード・ページのコードが集計ページのリクエストまたはレスポンス・オブジェクトにアクセスする必要がある場合、開発者はインクルード・ページではなく、JESI fragment
タグ(集計ページのJESI template
タグ内)にコードを配置できます。
データベース内の関連データへの変更など、外部の状況によっては、キャッシュ内のオブジェクトを明示的に失効化する必要があります。また、あるページの実行によって、別のページに対応しているキャッシュ内のオブジェクトのデータが失効になる場合もあります。
このため、JESIには、JESI invalidate
タグと複数のサブタグが用意されています。これらのタグを使用すると、次の適切な組合せに基づいてページを失効化できます。
失効化メッセージはXMLベースのフォーマットで、失効化する対象のURLを指定します。このメッセージは、JESI invalidate
タグの実行時にJSPコンテナで起動され、POST
メソッドによってHTTPを介してキャッシュ・サーバーにフォワードされます。次に、キャッシュ・サーバーが応答し、失効化レスポンスがHTTPを介して返信されます。
タグ構文と例は、「キャッシュ内のオブジェクトの失効化に使用するタグとサブタグの説明」を参照してください。
動的Webページには、個別のユーザーにあわせてカスタマイズされた情報が頻繁に表示されます。たとえば、「ようこそ」のページには、ユーザー名や特別な挨拶文、あるいはユーザーが所有している株式の現在の相場などが表示されます。
このようなカスタマイズされた出力の場合、Webページは、JESI personalize
タグによって提供されるCookie情報に依存します。このタグは、この依存性をESIプロセッサに通知します。このタグがない場合は、Webページを複数のユーザーがESIレベルで共有できません。
タグ構文と例は、「ページのパーソナライズに使用するタグの説明」を参照してください。
この項では、OC4Jが提供するJESIタグの構文と属性を説明し、使用例を示します。説明は、次のカテゴリで構成されています。
標準JavaServer Pagesタグ・ライブラリの実装であるOracle JESIタグ・ライブラリは、OC4Jが提供するojsputil.jar
ファイルに含まれています。このファイルがインストール済で、クラスパスに存在していることを確認してください。
JESIタグ・ライブラリを使用するには、タグ・ライブラリ・ディスクリプタ・ファイルjesitaglib.tld
が、アプリケーションとともにデプロイされている必要があります。また、ライブラリを使用するJSPページには、適切なtaglib
ディレクティブが存在する必要があります。Oracle9iASのインストール時、TLDファイルは、予約済のタグ・ライブラリ・ディレクトリに置かれます。taglib
ディレクティブと予約済のタグ・ライブラリ・ディレクトリの詳細は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
注意:
|
この項では、次のタグの使用について要約し、その構文と属性を説明します。
さらに、control/includeモデルとtemplate/fragmentモデルの両方の例を示します。各モデルの概要は、「JESIの使用モデル」を参照してください。
JESI control
タグは、control/include 使用モデルでJSPページのキャッシュ動作を制御します。JESI control
タグは、トップレベルのページまたは任意のインクルード・ページで使用できます。ただし、必須ではありません。JESI control
タグがないページ、またはJESI control
タグはあるがcache
属性の設定がないページがキャッシュ可能かどうかは、ESIプロセッサの設定によって決まります。(詳細は、「JESIの使用モデル」を参照してください。)
JESI control
タグは、ページ内の他のすべてのJESIタグおよびバッファ・フラッシュの前に配置してください。
次の点に注意してください。
control
タグを使用しないでください。また、追加のJESI control
タグを、jsp:include
機能によって同じレスポンス・オブジェクトにインクルードされているぺージに使用しないでください。いずれの場合も、例外が発生します。
control
タグとJESI template
タグを同じページ、または同じレスポンス・オブジェクトにインクルードされている個別のページに使用しないでください。例外が発生します。
control
タグは、インクルード・ページには影響を与えません。必要に応じて、各インクルード・ページでJESI control
タグを使用してください。
control
タグを含むページがリクエスト・パラメータに依存している場合は、ESIサーバーでパラメータ付きのページをキャッシュする必要があるかどうかを検討してください。異なるリクエスト・パラメータ値が多すぎるため、キャッシュ内のエントリが多くなりすぎることが予想される場合は、そのページをまったくキャッシュしない選択もできます(つまり、cache="no"
を設定します)。
<jesi:control [ expiration = "value" ] [ maxRemovalDelay = "value" ] [ cache = "yes" | "no" | "no-remote" ] />
expiration
: キャッシュ内のオブジェクトの存続期間を秒単位で指定します。デフォルトは300です。
maxRemovalDelay
: 期限が切れたキャッシュ内のオブジェクトを、ESIプロセッサで格納できる最大時間(秒単位)を指定します。デフォルトは0(ゼロ)で、即時に削除されます。
cache
: タグに対応するオブジェクトがキャッシュ可能かどうかを指定します。キャッシングを有効にするには、cache
を「yes
」に設定します。キャッシングを無効化するには、cache
を「no
」に設定します。また、リモートESIプロセッサやコンテンツ配信ネットワーク上ではなく、一番近いキャッシュ内のキャッシングのみを有効にするには、「no-remote
」に設定します。cache
パラメータを設定しない場合、キャッシュ可能かどうかは、ESIプロセッサの設定によって決まります。
ページをキャッシュ不可にするのは、たとえば、JESI include
タグをcopyparam
を有効にして使用している場合です。次の「JESI includeタグ」を参照してください。
JESI include
タグは、標準のjsp:include
タグと同様に、インクルード・ページの出力をインクルード先ページの出力に動的に挿入します。さらに、このタグは、ESIプロセッサにインクルード・ページの処理とアセンブルを指示します。各インクルード・ページは、独立したキャッシュ可能オブジェクト(設定によっては、キャッシュ不可オブジェクト)です。
このタグは、次の使用例にあるcontrol/includeモデルまたはtemplate/fragmentモデルのいずれでも使用できます。
control
タグなしで、またはJESI template
タグとfragment
タグなしで独立して使用
control
タグの後に使用
template
タグ内で使用(フラグメント以外)
fragment
タグ内で使用
(詳細は、「JESIの使用モデル」を参照してください。)
インクルード・ページがキャッシュ可能かどうかは、そのページ内のJESI control
タグのcache
属性の設定(設定されている場合)によって決まります。cache
属性の設定がない場合、キャッシュ可能かどうかは、ESIプロセッサの設定によって決まります。
JESI include
タグの使用方法は、jsp:include
と類似していますが、セマンティクスが異なるため、リクエスト・オブジェクトやレスポンス・オブジェクトを集計ページとインクルード・ページとの間で渡す必要があるページのインクルードには適していません。
<jesi:include page = "uri" [ alt = "alternate_uri" ] [ ignoreError = "true" | "false" ] [ flush = "true" | "false" ] [ copyparam = "true" | "false" ] />
page
(必須): ページ相対URL構文またはアプリケーション相対URL構文のいずれかを使用して、インクルード対象のJSPページのURIを指定します。(ページ相対URL構文とアプリケーション相対URL構文の詳細は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。)完全な「http://...
」または「https://...
」のURLもサポートされています。
alt
: page
属性に指定されたページにアクセスできない場合に、インクルード対象となる代替ページのURIを指定します。構文は、page
属性の構文と同じです。
ignoreError
: 「true
」に設定すると、インクルード・ページ(page
属性またはalt
属性で指定したページ)にアクセスできない場合でも、ページのインクルード処理を続行できます。デフォルトは「false
」です。
flush
: この属性は無視されます。ただし、jsp:include
構文からの移行を容易にするためにサポートされています。
copyparam
: インクルード・ページがリクエスト・パラメータを使用する場合は、この属性を「true
」に設定すると、インクルード先ページのHTTPリクエスト文字列からインクルード・ページにパラメータとその値をコピーできます。デフォルトは「false
」です。
リクエスト・パラメータがインクルード・ページに必要で、copyparam="true"
の場合は、インクルード先ページをキャッシュしない(JESI control
、JESI template
またはJESI fragment
のタグにcache="no"
を設定)か、ESIサーバーでインクルード・ページをパラメータ付きでキャッシュするかのいずれかを実行する必要があります。たとえば、次のような使用例は避ける必要があります。
<jesi:control cache="yes"/> ... <jesi:include page="arf.jsp" copyparam="true" />
その理由は、キャッシュからインクルード先ページをコピーすると、そのページがサーバー上で実行されないか、またはパラメータがarf.jsp
に適切にコピーされないためです。この結果、クライアントには不適切なパラメータから生成されたarf.jsp
が提供されることになります。
ただし、この使用例は、次のような特定の状況では、問題となりません。
または
この項では、control/includeモデルでのJESIタグの使用例を示します。
JESIタグを使用した完全なサンプル・アプリケーションは、OC4Jのデモを参照してください。
control/include 次の例では、デフォルトのキャッシュ設定を使用します。JESI control
タグは不要です。JESI include
タグは、代替ファイルを指定しません。したがって、「ファイルが見つかりません。」というエラーが発生すると処理は停止します。flush
属性は、使用できますが、無視されます。
<%@ taglib uri="/WEB-INF/jesitaglib.tld" prefix="jesi" %> <html> <body> <jesi:include page="stocks.jsp" flush="true" /> <p> <hr> <jesi:include page="/weather.jsp" flush="true" /> <p> <hr> <jesi:include page="../sales.jsp" flush="true" /> </body> </html>
この例では、JESI control
タグを使用し、maxRemovalDelay
およびexpiration
に対して、デフォルト以外のキャッシュ設定を指定します。さらに、ページのキャッシングを明示的に有効にします。ただし、デフォルトですでに有効になっています。最初のJESI include
タグは、ESIプロセッサがorder.jsp
を取得できない場合の代替ページを指定し、どのページも取得できない場合でも処理が続行されることを指定します。第2のJESI include
タグは、代替ページを指定しません。したがって、ページを取得できない場合、処理は停止します。
また、「例1: control/include」で使用したHTMLタグは、実際は必須でないことがわかります。
<%@ taglib uri="/WEB-INF/jesitaglib.tld" prefix="jesi" %> <jesi:control maxRemovalDelay="1000" expiration="300" cache="yes"/> <jesi:include page="order.jsp" alt="alt.jsp" ignoreError="true"/> <jesi:include page="commit.jsp" />
これは、条件付きの出力を含む集計ページの例です。Cookieは、カスタマの識別情報を表します。Cookieが見つからない場合は、一般的な製品情報を含む一般的な「ようこそ」ページが表示されます。Cookieが見つかった場合は、ユーザー・プロファイルに基づいて製品リストが表示されます。このリストは、JESI include
文を使用してページに表示されます。
JESI control
タグは、maxRemovalDelay
およびexpiration
に対してデフォルト以外の値も設定し、そのページのキャッシングを明示的に有効化します。
<%@ taglib uri="/WEB-INF/jesitaglib.tld" prefix="jesi" %> <jesi:control maxRemovalDelay="1000" expiration="300" cache="yes"/> <% String customerId=CookieUtil.getCookieValue(request,"customerid"); if (customerId==null) { // some unknown customer %> <jesi:include page="genericwelcome.jsp" /> <% } else { // a known customer; trying to retrieve recommended products from profiling String recommendedProductsDescPages[]= ProfileUtil.getRecommendedProductsDescURL(customerId); for (int i=0; i < recommendedProductsDescPages.length; i++) { %> <jesi:include page="<%=recommendedProductsDescPages[i]%>" /> <% } } %>
次に、リクエスト・パラメータを含むJESI include
文の使用例を示します。メイン・ページには、次のURLからアクセスすると想定します。
http://host:port/application1/main.jsp?p2=abc
メイン・ページは、パラメータ設定p2=abc
を取得します。ページは次のとおりです。
<%@ taglib uri="/WEB-INF/jesitaglib.tld" prefix="jesi" %> <html> <jesi:control cache="no" /> <jesi:include page="a.jsp?p1=v1" /> <h3>hello ...</h3> <jesi:include page="b.jsp" /> <h3>world ...</h3> <jesi:include page="c.jsp?p1=v2" copyparam="true" /> </html>
a.jsp
ページは、パラメータ設定p1=v1
を取得します。c.jsp
ページは、設定p1=v2
に加えて設定p2=abcを(copyparam
およびメイン・ページのURLにp2
を設定した結果として)取得します。
さらに、このページは、cache="no"
の設定によって、キャッシュ不可です。実際には、このようにインクルード先ページがキャッシュ不可の場合のみ、JESI include
タグでcopyparam
設定を使用することに注意してください。これはリクエスト属性がリクエストのたびに変わるためです。また、このcache="no"
設定は、インクルード・ページには効果がないことにも注意してください。インクルード・ページは、デフォルトでキャッシュ可能な状態です。つまり、それぞれのインクルード・ページ自体に、cache="no"
設定を含むJESI control
タグがないかぎり、キャッシュ可能です。
template/fragmentの使用モデルで、集計ページ(フラグメント以外)のキャッシング動作を指定するには、JESI template
タグを使用します。(詳細は、「JESIの使用モデル」を参照してください。)対応するHTTPヘッダーは、その枠のアーキテクチャ仕様に基づいて設定されます。集計コンテンツ(フラグメント以外)は、キャッシュ可能オブジェクトです。JESI fragment
タグで設定される各フラグメントも、独立したキャッシュ可能オブジェクトです。
JESI template
開始タグは、ページ内の他のすべてのJESIタグおよびバッファ・フラッシュの前に配置してください。JESI template
終了タグは、ページ内の他のすべてのJESIタグの後に配置する必要があります。
JESI template
タグにcache
属性が設定されていない場合、対応するオブジェクトがキャッシュ可能かどうかは、ESIプロセッサの設定によって決まります。
JESI template
タグは、必ずJESI fragment
タグとともに使用します。個別のフラグメントが不要な場合は、JESI template
タグではなく、JESI control
タグを使用します。
次の点に注意してください。
template
タグを使用しないでください。また、追加のJESI template
タグを、jsp:include
機能によって同じレスポンス・オブジェクトにインクルードされているぺージに使用しないでください。いずれの場合も、例外が発生します。
control
タグとJESI template
タグを同じページ、または同じレスポンス・オブジェクトにインクルードされている個別のページに使用しないでください。例外が発生します。
template
タグの設定は、各フラグメントには影響を与えません。フラグメントには独自の設定が必要です。
template
タグを含むページがリクエスト・パラメータに依存している場合は、ESIサーバーでパラメータ付きのページをキャッシュする必要があるかどうかを検討してください。異なるリクエスト・パラメータ値が多すぎるため、キャッシュ内のエントリが多くなりすぎることが予想される場合は、そのページをまったくキャッシュしない選択もできます(つまり、cache="no"
を設定します)。
JESI template
タグには、JESI control
タグの場合と同じ使用方法で同じ属性を指定します。
<jesi:template [ expiration = "value" ] [ maxRemovalDelay = "value" ] [ cache = "yes" | "no" | "no-remote" ] > ...page content, jesi:fragment tags, jesi:include tags... </jesi:template>
属性の説明は、「JESI controlタグ」を参照してください。
注意: リクエスト・パラメータがフラグメントで必要な場合は、それを囲んでいるテンプレートをキャッシュしない(JESI |
template/fragmentモデルでは、1つ以上のJESI fragment
タグを、JESI template
タグ内、つまりJESI template
の開始タグと終了タグ間で使用します。(詳細は、「JESIの使用モデル」を参照してください。)JESI fragment
タグは、必要に応じて、JSPコードの個別のフラグメントのキャッシング動作を定義します。各フラグメントは独立したキャッシュ可能オブジェクトです。
特定のフラグメントがESI機能によってリクエストされると、ESIプロセッサは、そのフラグメントのみを取得します。
JESI fragment
タグごとに、独自の指示をESIプロセッサに指定します。cache
属性が設定されていない場合、対応するオブジェクトがキャッシュ可能かどうかは、ESIプロセッサの設定によって決まります。JESI template
タグの設定は、フラグメントには影響を与えません。
JESI fragment
タグには、JESI control
タグおよびJESI template
タグの場合と同じ使用方法で同じ属性を指定します。
<jesi:fragment [ expiration = "value" ] [ maxRemovalDelay = "value" ] [ cache = "yes" | "no" | "no-remote" ] > ...JSP code fragment... </jesi:fragment>
属性の説明は、「JESI controlタグ」を参照してください。
この項では、template/fragmentモデルでのJESIタグの使用例を示します。
この例は、JESI template
タグとJESI fragment
タグの一般的な使用例です。タグにはexpiration
属性のみが設定されているため、他のすべての設定はデフォルトに従います。
集計コンテンツ(フラグメント以外)には、JESI template
タグに基づいて、3600秒の期限切れ時間が使用されています。この期限切れの設定は、フラグメント以外のすべてのHTMLブロックに適用されます。JSPコード・ブロック#1は期限切れ設定60で、JSPコード・ブロック#2はデフォルトの期限切れ設定で、JSPコード・ブロック#3は期限切れ設定600でそれぞれキャッシュされます。
<%@ taglib uri="/WEB-INF/jesitaglib.tld" prefix="jesi" %> <jesi:template expiration="3600"> ...HTML block #1... <jesi:fragment expiration="60"> ...JSP code block #1... </jesi:fragment> ...HTML block #2... <jesi:fragment> ...JSP code block #2... </jesi:fragment> ...HTML block #3... <jesi:fragment expiration="600"> ...JSP code block #3... </jesi:fragment> ...HTML block #4... </jesi:template>
この例では、フラグメント内でJESI include
タグを使用します。次に、このページのキャッシュ可能オブジェクトを示します。
<%@ taglib uri="/WEB-INF/jesitaglib.tld" prefix="jesi" %> <jesi:template expiration="3600"> ...HTML block #1... <jesi:fragment expiration="60"> ...JSP code block #1... <jesi:include page="stocks.jsp" /> </jesi:fragment> ...HTML block #2... <jesi:fragment> ...JSP code block #2... <jesi:include page="/weather.jsp" /> </jesi:fragment> ...HTML block #3... <jesi:fragment expiration="600"> ...JSP code block #3... <jesi:include page="../sales.jsp" /> </jesi:fragment> ...HTML block #4... </jesi:template>
ESIプロセッサでキャッシュ内のオブジェクトを明示的に失効化するには、JESI invalidate
タグと、必要に応じて、次のサブタグを使用します。
概要は、「キャッシュ内のオブジェクトの失効化」を参照してください。
JESI invalidate
タグをそのサブタグJESI object
とともに使用すると、1つ以上のキャッシュ内のオブジェクトを明示的に失効化できます。
サブタグは、次のように使用します。
object
サブタグを使用します。
object
タグのJESI cookie
サブタグまたはJESI header
サブタグを使用し、CookieまたはHTTPヘッダー情報に基づいて、失効化対象の追加基準を指定します。
<jesi:invalidate [ url = "url" username = "username" password = "password" ] [ config = "configfilename" ] [ output = "browser" ] >
必須サブタグ(「JESI objectサブタグ」を参照)
<jesi:object ... >
JESI object
のオプションのサブタグ(「JESI cookieサブタグ」を参照)
<jesi:cookie ... />
JESI object
のオプションのサブタグ(「JESI headerサブタグ」を参照)
<jesi:header ... /> </jesi:object> </jesi:invalidate>
ユーザー、パスワードおよびURLのすべてをそれぞれ個別のタグを使用して指定するか、またはconfig
属性で参照する構成ファイルにすべてを指定します。
url
: キャッシュ・サーバーのURLを指定します。この属性を省略すると、URLをJESI構成ファイルに指定する必要があります。
username
: キャッシュ・サーバーにログインするユーザー名を指定します。この属性を省略すると、ユーザー名をJESI構成ファイルに指定する必要があります。
password
: キャッシュ・サーバーにログインするためのパスワードを指定します。この属性を省略すると、パスワードをJESI構成ファイルに指定する必要があります。
config
: JESI構成ファイルを指定します。この構成ファイルを使用すると、対応するタグ属性を使用せずに、キャッシュ・サーバーのURL、ユーザー名およびパスワードを指定できます。「/
」で開始する場所をアプリケーション相対URL構文に指定します。アプリケーション相対URL構文の一般情報は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。
output
: 必要に応じて、キャッシュ・サーバーから失効化レスポンスを受信する出力デバイスを設定します。現在サポートされている設定は、ユーザーのWebブラウザにメッセージを表示する「browser
」のみです。このパラメータを設定しないと、確認メッセージはまったく表示されません。
次に、URLとログイン情報の設定用に、url
、username
およびpassword
属性のかわりに使用する構成ファイルの例を示します。
<?xml version="1.0" ?> <ojsp-config> <web-cache> <url>http://yourhost.yourcompany.com:4001</url> <username>invalidator</username> <password>invpwd</password> </web-cache> </ojsp-config>
完全なURIまたはURI接頭辞に基づいて、失効化するキャッシュ内のオブジェクトを指定するには、JESI invalidate
タグの必須サブタグJESI object
を使用します。必要に応じて、JESI cookie
サブタグまたはJESI header
サブタグを使用し、CookieまたはHTTPヘッダー情報に基づいて失効化の追加基準を指定します。
uri
属性の設定に、完全なURIまたはURI接頭辞のいずれかを指定します。このフィールドが完全なURIまたは接頭辞として解析されるかどうかは、prefix
属性の設定によって決まります。
<jesi:object uri = "uri_or_uriprefix" [ maxRemovalDelay = "value" ] [ prefix = "yes" | "no" ] >
オプションのサブタグ(「JESI cookieサブタグ」を参照)
<jesi:cookie ... />
オプションのサブタグ(「JESI headerサブタグ」を参照)
<jesi:header ... /> </jesi:object>
または(いずれのサブタグも使用しない場合)
<jesi:object uri = "uri_or_uriprefix" [ maxRemovalDelay = "value" ] [ prefix = "yes" | "no"] />
uri
(必須): 失効化するキャッシュ内のオブジェクトに対応するページの完全なURI(prefix="no"
の場合)、または複数ページのオブジェクトを指定するURI接頭辞(prefix="yes"
の場合)のいずれかを指定します。
接頭辞を指定すると、そのディレクトリに属しているページのキャッシュ内のオブジェクトがすべて失効化されます。たとえば、「/abc/def
」という接頭辞を設定した場合は、対応するディレクトリとサブディレクトリにあるすべてのページについて、キャッシュ内のオブジェクトが失効化されます。
prefix
: uri
属性をURI接頭辞としてのみ解析する場合は、「yes
」に設定します。uri
属性を完全なURIとして解析する場合は、デフォルト設定の「no
」を使用します。
maxRemovalDelay
: 失効化されたキャッシュ内のオブジェクトを、ESIプロセッサで格納できる最大時間(秒単位)を指定します。デフォルトは0(ゼロ)で、即時に削除されます。
失効化の追加基準としてCookie情報を使用する場合は、JESI object
タグ(JESI invalidate
タグのサブタグ)のJESI cookie
サブタグを使用します。このサブタグは、JESI object
タグでのURIまたはURI接頭辞の設定に加えて使用されます。JESI header
タグに加えて使用される場合もあります。
<jesi:cookie name = "cookie_name" value = "cookie_value" />
失効化するキャッシュ内のオブジェクトには、この名前と値に一致するCookieが含まれている必要があります。
失効化の追加基準としてHTTP/1.1ヘッダー情報を使用する場合は、JESI object
タグ(JESI invalidate
タグのサブタグ)のJESI header
サブタグを使用します。このサブタグは、JESI object
タグでのURIまたはURI接頭辞の設定に加えて使用されます。JESI cookie
タグに加えて使用される場合もあります。
<jesi:header name = "header_name" value = "header_value" />
失効化するキャッシュ内のオブジェクトには、この名前と値に一致するヘッダーが含まれている必要があります。
この項では、JESI invalidate
タグ、そのサブタグJESI object
およびJESI object
タグのJESI cookie
サブタグを使用したページの失効化の例を示します。
この例では、完全なURIによって指定された、ESIプロセッサ内のシングル・オブジェクトを失効化します。(デフォルトでは、uri
は、URI接頭辞ではなく、完全なURIを指定します。)JESI invalidate
タグは、キャッシュ・サーバーのURLおよびログインするユーザー名とパスワードも指定します。さらに、キャッシュ・サーバーからの失効化レスポンスをユーザーのブラウザに表示することを指定します。
<jesi:invalidate url="http://yourhost.yourcompany.com:4001" username="invalidator" password="invpwd" output="browser"> <jesi:object uri="/images/logo.gif"/> </jesi:invalidate>
この例は、「例1: ページの失効化」と同じです。ただし、構成ファイルを使用してキャッシュ・サーバーURLとログイン情報を指定します。
<jesi:invalidate config="/myconfig.xml" output="browser"> <jesi:object uri="/images/logo.gif"/> </jesi:invalidate>
JESI invalidate
タグでは、構成ファイルのアプリケーション相対URL構文が使用されます。たとえば、myconfig.xml
には、次のようなコンテンツがあります。
<?xml version="1.0" ?> <ojsp-config> <web-cache> <url>http://yourhost.yourcompany.com:4001</url> <username>invalidator</username> <password>invpwd</password> </web-cache> </ojsp-config>
この例では、URI接頭辞「/
」に従って、ESIプロセッサ内の全オブジェクトを失効化します。この例では、失効化確認メッセージのブラウザでの表示は指定していません。したがって、このメッセージはまったく表示されません。
<jesi:invalidate url="http://yourhost.yourcompany.com:4001" username="invalidator" password="invpwd"> <jesi:object uri="/" prefix="yes"/> </jesi:invalidate>
この例では、シングル・オブジェクトを失効化します。ただし、このオブジェクトは最大30分(1800秒)間は有効状態を維持できます。
<jesi:invalidate url="http://yourhost.yourcompany.com:4001" username="invalidator" password="invpwd"> <jesi:object uri="/images/logo.gif" maxRemovalDelay="1800"/> </jesi:invalidate>
この例では、「例1: ページの失効化」と同じオブジェクトに失効化を指定します。ただし、値customer
を持つuser_type
という名前のCookieがある場合のみ、そのオブジェクトを失効化することを指定します。
<jesi:invalidate url="http://yourhost.yourcompany.com:4001" username="invalidator" password="invpwd"> <jesi:object uri="/images/logo.gif"> <jesi:cookie name="user_type" value="customer"/> </jesi:object> </jesi:invalidate>
同じキャッシュ内のページが複数のユーザー間で共有されている状態で、ページのカスタマイズを許可するには、そのページによるCookie情報とセッション情報への依存性をESIプロセッサに通知する必要があります。たとえば、Cookie値の置換は、Webサーバーではなく、ESIプロセッサで発生します。
JESI personalize
タグは、Cookie情報とセッション情報への依存性をESIプロセッサに通知して、ページのカスタマイズを許可します。
<jesi:personalize name = "cookie_name" [ value = "default_value" ] />
name
(必須): ページのパーソナライズに使用する値を持つCookieの名前を指定します。
value
: Cookieが見つからない場合に使用するデフォルト値。このデフォルト値によって、ESIプロセッサはCookieの取得のためWebサーバーに対して問い合せる必要がなくなります。
次に、JESI personalize
タグの使用例を示します。
<jesi:personalize name="user_id" value="guest" />
生成されたESIタグによって、ESIプロセッサは必要な情報を検出できます。この場合、プロセッサは、user_id
という名前のCookieを検索し、その値を取得します。このCookieが見つからない場合は、デフォルト値の「guest
」を使用します。このCookie値の置換をESIプロセッサで処理することによって、Webサーバーへのリクエストの送信が不要になります。
JESIタグ・ハンドラ・クラスは、OC4JのJESIタグ・ライブラリの一部として提供され、JSP機能からESI機能へのブリッジの役を果たします。タグ・ハンドラは、JESIタグのESIタグへの変換、失効化に対するHTTPリクエストの生成、HTTPレスポンス・ヘッダーの設定などを行います。ただし、この変換は、JESIタグとESIタグの間またはJESIタグ属性とESIタグ属性の間の単純な1対1のマッピングとはかぎりません。
JESIとESI間での変換の例として、次のJSPコードを示します。
<p>BEGIN</p> <jesi:control cache="no"/> <jesi:include page="stocks.jsp" flush="true" /> <p> <hr> <jesi:include page="/weather.jsp" copyparam="true" flush="true" /> <p> <hr> <jesi:include page="../sales.jsp?tax=local" copyparam="true" flush="true" /> <p>END</p>
このJSPコードは、次のURLを含むページの一部と想定します。
http://host:port/application1/top.jsp
さらに次のリクエストを想定します。
http://host:port/application1/top.jsp?city=Washington_DC
この場合、JESI include
タグ・ハンドラは、次のレスポンスのように、ESIコードを生成します。
レスポンス・ヘッダーは、次のとおりです。
Surrogate-Control: content="ESI/1.0",max-age=300+0
レスポンス・ボディは、次のとおりです。
<p>BEGIN</p> <esi:include src="/application1/stocks.jsp"/> <p> <hr> <esi:include src="/weather.jsp?city=Washington_DC"/> <p> <hr> <esi:include src="/sales.jsp?tax=local&city=Washington_DC"/> <p>END</p>
このレスポンスは、クライアントに配信される前に、ESIプロセッサによって読み込まれますSurrogate-Control
ヘッダーは、ESIプロセッサに対して、レスポンス・ボディにESIコードが含まれていることを警告します。したがって、キャッシング機能は、<esi:>
タグのレスポンス・ボディ内を検索します。さらに、Surrogate-Control
ヘッダーによって、そのページのキャッシュ期限切れおよび最大遅延間隔が設定されます。この場合は、デフォルトの期限切れ300とデフォルトの最大遅延0(ゼロ)が使用されます。これは、JESI control
タグに特に指定がないためです。
3つのesi:include
タグのそれぞれに対して、ESIプロセッサは、指定されたURLに追加リクエストを作成します。各レスポンスは、トップレベルのページにインクルードされ、そのページがアセンブルされた後でのみ、クライアントに配信されます。クライアントが受信するレスポンスは1つですが、キャッシュでは、そのレスポンスを取得するために4つのリクエストが作成されます。この操作は、オーバーヘッドが大きいように見えますが、weather.jsp
などのように、他の多数のリクエストによって同じインクルード・ページが使用される場合は、全体の効率が向上します。これらのページは、ESIサーバー上で個別にキャッシュされるため、これらのページに対するリクエストは不要です。
従業員が企業イントラネット・サイトに接続する場合を想定します。すべてのレスポンスに存在する少数の機能を除いて、そのページのコンテンツは動的です。特に、株式チャートとその企業に関する最新のビジネス見出しを表示するフッターは常に存在しています。このビジネス見出しは外部のビジネス・ニュース・サイトから取得されます。戻すページのすべてに同じ情報が含まれている必要があり、取得にはコストがかかるため、このフッターはESIサーバー上でキャッシュするほうが効率的です。
ページ・レスポンスの残りの部分は動的で、毎回わずかに異なる方法で株式のフラグメントが取り込まれます。ページの再書込みを回避するために、フッターにJESIフラグメントのマークを、それを囲んでいるページにJESIテンプレートのマークを付けることができます。
チャリティ・キャンペーンの期間中、主催者が目標金額と現在の寄付金額を示す棒グラフを、すべての企業ページの一部として表示すると想定します。この情報は、特別のデータベースに格納されており、毎日2回更新されています。この棒グラフは、JESIフラグメントの追加として適切な候補です。
JESI template
タグをページの最上部に追加し、JESI fragment
タグを使用して、個別エンティティとしてキャッシュするフラグメントを囲みます。
企業ページへのURLは、次のURLと想定します。
http://www.bigcorp.com/employee_page.jsp
さらに、そのページを次のように変更したと想定します。
<%@ taglib uri="/WEB-INF/jesitaglib.tld" prefix="jesi" %> <jesi:template cache="no" > <p>BEGIN</p> ... some dynamic page content... <jesi:fragment> This_is_the_body_of_Charity_Chart </jesi:fragment> ... some more dynamic content... <jesi:fragment> This_is_the_body_of_Business_Footer </jesi:fragment> <p>END</p>
ページのリクエスト時に、次のHTTPレスポンスが生成されます。
レスポンス・ヘッダーは、次のとおりです。
Surrogate-Control: content="ESI/1.0",max-age=300+0,no-store
レスポンス・ボディは、次のとおりです。
<p>BEGIN</p> ... some dynamic page content... <esi:include src="/employee_page.jsp?__esi_fragment=1"/> ... some more dynamic content... <esi:include src="/employee_page.jsp?__esi_fragment=2"/> <p>END</p>
「例: JESIとESI間でのインクルード・ページの変換」に示したJESI include
の例と同様に、Surrogate-Control
レスポンス・ヘッダーはESIサーバーに対して警告を通知します。no-store
ディレクティブが生成された理由は、JESI template
タグにcache="no"
の設定があるためです。さらに、デフォルトの期限切れ300とデフォルトの最大遅延0(ゼロ)が使用されています。これは、JESI template
タグで特に指定されていないためです。
ESIサーバーは、2つのリクエストを追加作成し、2つのフラグメントをフェッチしてキャッシュします。その後で、合成されたページが従業員に戻されます。従業員がそのページで再度作業をすると、動的コンテンツが新規に生成されます。ただし、チャートとフッターはキャッシュから提供されます。