Oracle9iAS Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス
リリース9.0.3

部品番号 J06903-01
       

Edge Side Includes用のJESIタグ

このトピックでは、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キャッシング・サポートのサマリー」を参照してください。

Edge Side Includesテクノロジと処理の概要

この項では、Oracle JESIタグの基礎となっている基本テクノロジの一部に関するバックグラウンド情報について説明します。

JESIタグは、JSPページの動的コンテンツをキャッシュ可能なコンポーネントに分割します。その基礎となるのがEdge Side IncludesアーキテクチャとESIマークアップ言語です。

JESIタグの使用は、特定のESIプロセッサやキャッシング・システムに依存しているわけではありませんが、Oracleユーザーのほとんどは、Oracle9iAS Web CacheとそのESIプロセッサを使用しているものと思われます。

次の項目について説明します。

この項で説明するのは、ESIアーキテクチャと言語の簡単な概要のみです。ESIテクノロジに関する追加情報は、次のWeb サイトを参照してください。


http://www.edge-delivery.org

Edge Side Includesテクノロジ

この項では、ESIテクノロジの特性と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タグに指定されている指示を含むアセンブリ用のコンテナです。


注意: 

JESIユーザーはESIタグを直接使用する必要がない(通常は、使用しません)ことに注意してください。JESIタグ・ハンドラは、JESIタグをESIタグに背後で変換します。


サロゲートについて

サロゲートは、ページ・コンテンツを所有するWebサーバーのかわりに動作するため、コンテンツ所有者は、サロゲートの動作を完全に制御できます。これにより、サロゲートを使用しない場合に比較して、大幅なパフォーマンスの向上が可能になります。

サロゲートでのキャッシング処理は、HTTPでのキャッシング処理に全体的に類似しています。どちらも、類似した斬新な妥当性チェック機能を基盤として使用しています。ただし、サロゲートには、その上に制御機能も備わっています。

ESIの主要機能

ESI言語のバージョン1.0には、次の主要な機能が含まれています。

Oracle9iAS Web CacheとESIプロセッサ

この項では、Oracle9iAS Web CacheとそのESIプロセッサを紹介します。詳細は、『Oracle9iAS Web Cache管理および配置ガイド』を参照してください。

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の使用ステップ

次に、ブラウザとOracle9iAS Web Cacheとの典型的な相互作用のステップを示します。

  1. ブラウザが、企業のWebサイトにリクエストを送信します。

    このリクエストの結果、ドメイン・ネーム・システム(DNS)に対して、WebサイトのIPアドレスのリクエストが生成されます。

  2. DNSは、Oracle9iAS Web CacheのIPアドレスを戻します。

  3. ブラウザは、WebページのリクエストをOracle9iAS Web Cacheに送信します。

  4. リクエストされたコンテンツがキャッシュにある場合、Oracle9iAS Web Cacheは、そのコンテンツをブラウザに直接送信します。これは、キャッシュ・ヒットと呼ばれます。

  5. Oracle9iAS Web Cacheにリクエストされたコンテンツが存在しない場合、またはそのコンテンツが無効の場合、Web Cacheは、そのリクエストをアプリケーションWebサーバーに渡します。これは、キャッシュ・ミスと呼ばれます。

  6. アプリケーションWebサーバーは、コンテンツをOracle9iAS Web Cacheを介して送信します。

  7. Oracle9iAS Web Cacheは、そのコンテンツをクライアントに送信し、そのページのコピーをキャッシュに作成します。


注意: 

キャッシュに格納されたページは、失効化されるかまたは古くなると削除されます。


Oracle9iAS Web CacheのESIプロセッサ

Oracle9iAS Web Cacheには、Edge Side Includesマークアップ言語の使用をサポートするESIプロセッサが組み込まれています。(詳細は、「Edge Side Includesテクノロジ」を参照してください。)

Oracle9iAS Web Cache環境のWeb開発者は、自分のアプリケーションでESI言語を直接使用できます。ただし、JSP開発者の場合は、様々な理由から、ESI言語に対する便利なJSPインタフェースとして提供されているJESIタグ・ライブラリを使用します。「JESIタグのメリット」を参照してください。

JESI機能の概要

この項では、JESI機能とOracleによる実装について説明します。次の項目が含まれます。

次のWebサイトからJESIの提案仕様にアクセスできます。


http://www.edge-delivery.org

JESIタグのメリット

OC4Jでは、JESIタグ・ライブラリを、ESIタグとWebキャッシングに関するEdge Side Includes機能への便利なインタフェースとして提供しています。開発者は、WebアプリケーションでESIタグを直接使用できますが、JESIタグは、JSP環境で使用したほうがはるかに便利です。次に、ESIタグを直接使用せずに、JESIタグを使用する主なメリットについて説明します。

OracleによるJESIタグ実装の概要

OracleがJESIを実装するレイヤーは、標準ESIフレームワークの最上部です。JESIタグ・ライブラリは、標準実装であるため、次の点に注意してください。

Oracle JESIタグ・ライブラリは、次のタグをサポートします。

JSP開発者は、対応するESIタグ(esi:includeなど)ではなく、これらのタグ(JESI includeなど)を使用します。このタグの有用性と利便性については、「JESIタグのメリット」で説明しています。


注意: 

Oracle JESIタグ・ライブラリは、標準ライブラリです。標準JavaServer Pagesタグ・ライブラリのフレームワークに関する一般情報は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


JESIの使用モデル

集計ページとそのキャッシュ可能コンポーネントの定義にJESIタグを使用する方法には、次の2つのモデルがあります。

この項では、これら2つのモデルについて説明し、最後にJESI includeタグに関する特記事項を説明します。

control/includeモデル

JESIタグの使用方法の1つは、モジュール化された方法です。この方法では、ほとんど(またはすべて)のキャッシュ可能コンテンツをインクルード・ページとして集計ページに表示します。通常、このモデルは、次のように使用します。

このドキュメントでは、このモジュール化された方法を、control/includeモデルと呼びます。この方法は、新規ページを開発する場合に特に便利です。

各インクルード・ファイルは、個別のキャッシュ可能オブジェクトです(ただし、タグ設定によってキャッシングを失効化できます)。また、集計ページの追加コンテンツもすべて個別オブジェクトです。

状況によっては、両タグともオプションになります。ページには、JESI controlタグを、JESI includeタグなしで指定できます。実際に、これが既存のページをJESI用に変換する簡単な方法です。また、JESI includeタグを使用しているページに、必ずしもJESI controlタグを指定する必要はありません。

JESI controlタグによる指定がないページ(トップレベルのページかインクルード・ページであるかに関係なく)がキャッシュ可能かどうかは、ESIプロセッサの構成設定によって決まります。これは、ページにJESI controlタグがない場合、またはページにcache属性の設定がないJESI controlタグがある場合にも適用されます。


注意: 

集計ページのJESI controlタグは、インクルード・ページには影響を与えません。独自のJESI controlタグがないインクルード・ページでは、デフォルトのキャッシュ設定が使用されます。


タグ構文と例は、次の各項を参照してください。

template/fragmentモデル

もう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つのフラグメント内にリクエスト属性またはセッション属性を設定し、それを別のフラグメントに読み込むことは避けてください。このような、グローバルなページ・ロジックは、テンプレート・レベルに配置してください。


重要: 

Oracle9iASリリース2では、JESI template/fragmentモデルと明示的なESIマークアップ(<esi:inline>など)は、同じHTTPレスポンス内で使用できません。

たとえば、<jesi:template>タグと<jesi:fragment>タグを使用するJSPページがあり、そのページに<esi:inline>タグを使用してHTMLを生成するサーブレットが含まれている場合、Oracle9iAS Web Cacheではエラーが発生します。


タグ構文と例は、次の各項を参照してください。

JESI Includesについて

いずれのモデルを使用する場合も、JESI include文については、次の点に注意してください。

キャッシュ内のオブジェクトの失効化

データベース内の関連データへの変更など、外部の状況によっては、キャッシュ内のオブジェクトを明示的に失効化する必要があります。また、あるページの実行によって、別のページに対応しているキャッシュ内のオブジェクトのデータが失効になる場合もあります。

このため、JESIには、JESI invalidateタグと複数のサブタグが用意されています。これらのタグを使用すると、次の適切な組合せに基づいてページを失効化できます。

失効化メッセージはXMLベースのフォーマットで、失効化する対象のURLを指定します。このメッセージは、JESI invalidateタグの実行時にJSPコンテナで起動され、POSTメソッドによってHTTPを介してキャッシュ・サーバーにフォワードされます。次に、キャッシュ・サーバーが応答し、失効化レスポンスがHTTPを介して返信されます。

タグ構文と例は、「キャッシュ内のオブジェクトの失効化に使用するタグとサブタグの説明」を参照してください。

キャッシュ内のページのパーソナライズ

動的Webページには、個別のユーザーにあわせてカスタマイズされた情報が頻繁に表示されます。たとえば、「ようこそ」のページには、ユーザー名や特別な挨拶文、あるいはユーザーが所有している株式の現在の相場などが表示されます。

このようなカスタマイズされた出力の場合、Webページは、JESI personalizeタグによって提供されるCookie情報に依存します。このタグは、この依存性をESIプロセッサに通知します。このタグがない場合は、Webページを複数のユーザーがESIレベルで共有できません。

タグ構文と例は、「ページのパーソナライズに使用するタグの説明」を参照してください。


注意: 

このタグを、より多くの機能を持つOracle9iAS Personalizationタグ・ライブラリと混同しないでください。JESIによるパーソナライズは、キャッシュ内のページのプレースホルダを、ESIプロセッサがリクエスト時またはレスポンス時にCookieから送信される動的文字列に置換するだけです。この置換によって、異なるユーザーが同じキャッシュ内のページを共有できます。バックエンドでデータ・マイニングを使用するOracle Personalizationのほうが、はるかに動的な機能です。この機能によって、ユーザー・アクティビティに応じて自動的に変化する出力が生成されます。詳細は、「Oracle9iAS Personalizationのタグ」を参照してください。


Oracle JESIタグの説明

この項では、OC4Jが提供するJESIタグの構文と属性を説明し、使用例を示します。説明は、次のカテゴリで構成されています。

標準JavaServer Pagesタグ・ライブラリの実装であるOracle JESIタグ・ライブラリは、OC4Jが提供するojsputil.jarファイルに含まれています。このファイルがインストール済で、クラスパスに存在していることを確認してください。

JESIタグ・ライブラリを使用するには、タグ・ライブラリ・ディスクリプタ・ファイルjesitaglib.tldが、アプリケーションとともにデプロイされている必要があります。また、ライブラリを使用するJSPページには、適切なtaglibディレクティブが存在する必要があります。Oracle9iASのインストール時、TLDファイルは、予約済のタグ・ライブラリ・ディレクトリに置かれます。taglibディレクティブと予約済のタグ・ライブラリ・ディレクトリの詳細は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


注意: 

  • このタグ構文では、接頭辞「jesi:」が使用されます。これは、表記規則に従っていますが、必須ではありません。任意の接頭辞をtaglibディレクティブに指定できます。

  • このヘルプのタグ構文規則の詳細は、「タグ構文の表記と意味」を参照してください。

  • 特に注記がないかぎり、デフォルト設定は、ESIプロセッサによって決定されます。Oracle9iAS Web CacheのESIプロセッサの場合、このデフォルト設定は、キャッシュ・ルールに応じて行われます。


ページ設定とコンテンツのタグの説明

この項では、次のタグの使用について要約し、その構文と属性を説明します。

さらに、control/includeモデルとtemplate/fragmentモデルの両方の例を示します。各モデルの概要は、「JESIの使用モデル」を参照してください。

JESI controlタグ

JESI controlタグは、control/include 使用モデルでJSPページのキャッシュ動作を制御します。JESI controlタグは、トップレベルのページまたは任意のインクルード・ページで使用できます。ただし、必須ではありません。JESI controlタグがないページ、またはJESI controlタグはあるがcache属性の設定がないページがキャッシュ可能かどうかは、ESIプロセッサの設定によって決まります。(詳細は、「JESIの使用モデル」を参照してください。)

JESI controlタグは、ページ内の他のすべてのJESIタグおよびバッファ・フラッシュの前に配置してください。

次の点に注意してください。

構文


<jesi:control
             [ expiration = "value" ]
             [ maxRemovalDelay = "value" ]
             [ cache = "yes" | "no" | "no-remote" ] />


注意: 

JESIの提案仕様には、JESI control、JESI templateおよびJESI fragmentの各タグにcontrol属性が含まれています。この属性は、ESIの制御ヘッダーのパラメータを直接設定するための属性です。ただし、Oracle9iASリリース2の実装でサポートされているのは、制御ヘッダーのmax-ageパラメータの設定のみです。しかし、JESI controlタグのexpiration属性とmaxRemovalDelay属性を設定すると同じ結果となるため、control属性の設定は不要です。したがって、このヘルプでは、現在control属性の説明はしていません。


属性

JESI includeタグ

JESI includeタグは、標準のjsp:includeタグと同様に、インクルード・ページの出力をインクルード先ページの出力に動的に挿入します。さらに、このタグは、ESIプロセッサにインクルード・ページの処理とアセンブルを指示します。各インクルード・ページは、独立したキャッシュ可能オブジェクト(設定によっては、キャッシュ不可オブジェクト)です。

このタグは、次の使用例にあるcontrol/includeモデルまたは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" ] />

属性

例: control/includeモデル

この項では、control/includeモデルでのJESIタグの使用例を示します。

JESIタグを使用した完全なサンプル・アプリケーションは、OC4Jのデモを参照してください。

例1: control/include

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>

例2: control/include

この例では、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" />

例3: control/include

これは、条件付きの出力を含む集計ページの例です。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]%>" />
<%
    }
  }
%>

例4: control/include

次に、リクエスト・パラメータを含む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タグがないかぎり、キャッシュ可能です。

JESI templateタグ

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タグを使用します。

次の点に注意してください。

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タグにcache="no"を設定)か、ESIサーバーでフラグメントをパラメータ付きでキャッシュするかのいずれかを実行する必要があります。フラグメントのバックグラウンドでは、JESI includeタグによってインクルードされたページと同様に、追加リクエストが関係しています。リクエスト・パラメータ(設定されている場合)は、常にテンプレートからフラグメントに渡されます。これは、copyparam="true"が設定されたJESI includeタグの機能と同じです。(この種の問題については、「JESI includeタグ」でも説明しています。)


JESI fragmentタグ

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モデル

この項では、template/fragmentモデルでのJESIタグの使用例を示します。

例1: template/fragment

この例は、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>

例2: template/fragment

この例では、フラグメント内で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 invalidateタグをそのサブタグJESI objectとともに使用すると、1つ以上のキャッシュ内のオブジェクトを明示的に失効化できます。

サブタグは、次のように使用します。

構文


<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属性で参照する構成ファイルにすべてを指定します。


注意: 

invalidateタグ内で複数のobjectタグを使用することは可能です。


属性

例: 構成ファイル

次に、URLとログイン情報の設定用に、urlusernameおよび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>

JESI objectサブタグ

完全な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"] />


注意: 

  • invalidateタグ内で複数のobjectタグを使用することは可能です。

  • objectタグ内で複数のcookieタグまたはheaderタグを使用することは可能です。


属性

JESI cookieサブタグ

失効化の追加基準としてCookie情報を使用する場合は、JESI objectタグ(JESI invalidateタグのサブタグ)のJESI cookieサブタグを使用します。このサブタグは、JESI objectタグでのURIまたはURI接頭辞の設定に加えて使用されます。JESI headerタグに加えて使用される場合もあります。

構文


<jesi:cookie name = "cookie_name"
             value = "cookie_value" />


注意: 

objectタグ内で複数のcookieタグを使用することは可能です。


属性

失効化するキャッシュ内のオブジェクトには、この名前と値に一致するCookieが含まれている必要があります。

JESI headerサブタグ

失効化の追加基準としてHTTP/1.1ヘッダー情報を使用する場合は、JESI objectタグ(JESI invalidateタグのサブタグ)のJESI headerサブタグを使用します。このサブタグは、JESI objectタグでのURIまたはURI接頭辞の設定に加えて使用されます。JESI cookieタグに加えて使用される場合もあります。

構文


<jesi:header name = "header_name"
             value = "header_value" />


注意: 

objectタグ内で複数のheaderタグを使用することは可能です。


属性

失効化するキャッシュ内のオブジェクトには、この名前と値に一致するヘッダーが含まれている必要があります。

例: ページの失効化

この項では、JESI invalidateタグ、そのサブタグJESI objectおよびJESI objectタグのJESI cookieサブタグを使用したページの失効化の例を示します。

例1: ページの失効化

この例では、完全な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>

例2: ページの失効化

この例は、「例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>

例3: ページの失効化

この例では、URI接頭辞「/」に従って、ESIプロセッサ内の全オブジェクトを失効化します。この例では、失効化確認メッセージのブラウザでの表示は指定していません。したがって、このメッセージはまったく表示されません。


<jesi:invalidate url="http://yourhost.yourcompany.com:4001"
                 username="invalidator" password="invpwd">
     <jesi:object uri="/" prefix="yes"/>
</jesi:invalidate>

例4: ページの失効化

この例では、シングル・オブジェクトを失効化します。ただし、このオブジェクトは最大30分(1800秒)間は有効状態を維持できます。


<jesi:invalidate url="http://yourhost.yourcompany.com:4001"
                 username="invalidator" password="invpwd">
     <jesi:object uri="/images/logo.gif" maxRemovalDelay="1800"/>
</jesi:invalidate>

例5: ページの失効化

この例では、「例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タグ

JESI personalizeタグは、Cookie情報とセッション情報への依存性をESIプロセッサに通知して、ページのカスタマイズを許可します。

構文


<jesi:personalize name = "cookie_name"
                [ value = "default_value" ] />
属性

例: ページのパーソナライズ

次に、JESI personalizeタグの使用例を示します。


<jesi:personalize name="user_id" value="guest" />

生成されたESIタグによって、ESIプロセッサは必要な情報を検出できます。この場合、プロセッサは、user_idという名前のCookieを検索し、その値を取得します。このCookieが見つからない場合は、デフォルト値の「guest」を使用します。このCookie値の置換をESIプロセッサで処理することによって、Webサーバーへのリクエストの送信が不要になります。

JESIタグの処理とJESIとESI間での変換

JESIタグ・ハンドラ・クラスは、OC4JのJESIタグ・ライブラリの一部として提供され、JSP機能からESI機能へのブリッジの役を果たします。タグ・ハンドラは、JESIタグのESIタグへの変換、失効化に対するHTTPリクエストの生成、HTTPレスポンス・ヘッダーの設定などを行います。ただし、この変換は、JESIタグとESIタグの間またはJESIタグ属性とESIタグ属性の間の単純な1対1のマッピングとはかぎりません。

例: JESIとESI間でのインクルード・ページの変換

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サーバー上で個別にキャッシュされるため、これらのページに対するリクエストは不要です。

例: JESIと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つのフラグメントをフェッチしてキャッシュします。その後で、合成されたページが従業員に戻されます。従業員がそのページで再度作業をすると、動的コンテンツが新規に生成されます。ただし、チャートとフッターはキャッシュから提供されます。


注意: 

Surrogate-Controlヘッダーは、ESIサーバーによって使用され、クライアントへの最終レスポンスには表示されません。