ADF Faces Cacheライブラリ: <afc:cache>タグ

このタグは、キャッシュのプロパティを指定します。

一般的な構文

<afc:cache [duration="seconds"]
[varyBy="varyBy_param.varyBy_param_value [varyBy_param.varyBy_param_value...]"] 
[searchKeys="searchKey [searchKey...]"] 
[cacheMissOnRePost="true|false"]>
cacheable content
</afc:cache>    

ページ・フラグメント全体をキャッシュする構文

ページ・フラグメント全体にキャッシュ・プロパティを設定する場合は、<afc:cache>タグを<f:view>タグの直接の子として配置し、ページのコンテンツを<afc:cache>で囲みます。

page.jsp
<f:view>
  <afc:cache ...>
  cacheable page content
  </afc:cache>
</f:view>    

フラグメントをキャッシュする構文

メイン・ページ内に含まれるフラグメントにキャッシュ・プロパティを設定する場合は、各フラグメントを開始タグ<afc:cache>と終了タグ</afc:cache>で囲みます。

page.jsp
<f:view>
  ...
  <afc:cache ...>
  cacheable fragment content
  </afc:cache>
  ...
  <afc:cache ...>
  cacheable fragment content
  </afc:cache>
  ...
</f:view>    

ページのサブページに存在し、メイン・ページからインクルード(<jsp:include>)されたフラグメントにキャッシュ・プロパティを設定する場合は、<afc:cache>タグを<f:subview>タグの直接の子として配置し、そのフラグメントのコンテンツを<afc:cache>タグで囲みます。この方法で、キャッシュ可能なフラグメントを異なるページ間で共有できます。

page.jsp
<f:view>
  ...
  <afc:cache ...>
  cacheable fragment content
  </afc:cache>  <jsp:include page="/fragment.jsp" />
  <afc:cache ...>
  cacheable fragment content
  </afc:cache>
  ...
</f:view>


fragment.jsp
<f:subview>
  <afc:cache ...>
  cacheable fragment content
  </afc:cache>
</f:subview>    

次の例は、AFCPortalDemo_Cache.warから入手できるサンプル・ポータル・アプリケーションの抜粋です。AFCPortalDemo_Cache.warは、Oracle Technology Networkからダウンロードできます。URLは次のとおりです。

http://www.oracle.com/technology/sample_code/tech/java/codesnippet/index.html

この例は、メイン・ポータル・ページMain.jspの抜粋です。3つのキャッシュ可能なパネルが含まれています。各パネルは、<afc:cache>タグが付けられたキャッシュ可能なポートレットです。このタグには次の属性が指定されています。

main.jsp
<f:view>
...
<!-- The left panel --> 
      <afc:cache 
          id="LeftPortletCaching" 
          duration="86400" 
          searchKeys="oracle_news horoscope" 
          varyBy="MyPortalBean.leftPane[0] MyPortalBean.leftPane[1]"
          cacheMissOnRePost="false">
        <h:panelGroup>  
          <h:dataTable value="#{MyPortalBean.componentListLeft}" var="var">
            <h:column>
                <MyPortalTag:RenderPortlet type="#{var}" />
            </h:column>
          </h:dataTable>
          <h:outputText value="Last updated at:" styleClass="styleBody" 
                        style="font-weight:normal"/>
          <h:outputText value="#{now}" styleClass="styleBody" 
                        style="font-weight:normal">
              <f:convertDateTime pattern="hh:mm:ss a"/>
         </h:outputText>
        </h:panelGroup>
      </afc:cache>    
<!-- Center Panel -->
      <afc:cache 
          id="CenterPortletCaching" 
          duration="86400" 
          searchKeys="java_news weather" 
          varyBy="MyPortalBean.centerPane[0] MyPortalBean.centerPane[1]"
          cacheMissOnRePost="false">
        <h:panelGroup>
          <h:dataTable value="#{MyPortalBean.componentListCenter}" var="var">
            <h:column>
                <MyPortalTag:RenderPortlet type="#{var}" />
            </h:column>
          </h:dataTable>
          <h:outputText value="Last updated at:" styleClass="styleBody" 
                        style="font-weight:normal"/>
          <h:outputText value="#{now}" styleClass="styleBody" 
                        style="font-weight:normal">
              <f:convertDateTime pattern="hh:mm:ss a"/>
          </h:outputText>
        </h:panelGroup>
      </afc:cache>
<!-- Right panel -->
      <afc:cache 
          id="RightPortletCaching" 
          duration="86400" 
          searchKeys="world_news stocks" 
          varyBy="MyPortalBean.rightPane[0] MyPortalBean.rightPane[1]"
          cacheMissOnRePost="false">
        <h:panelGroup>
          <h:dataTable value="#{MyPortalBean.componentListRight}" var="var">
            <h:column>
                >
            </h:column>
          </h:dataTable>
          <h:outputText value="Last updated at:" styleClass="styleBody" 
                        style="font-weight:normal"/>
          <h:outputText value="#{now}" styleClass="styleBody" 
                        style="font-weight:normal">
              <f:convertDateTime pattern="hh:mm:ss a"/>
          </h:outputText>
        </h:panelGroup>
     </afc:cache>
</f:view>    

説明

このタグは、囲まれたコンポーネントのエンコーディングをキャッシュします。

<afc:cache>タグの使用時には、次のことを考慮する必要があります。

属性

duration
文字列。キャッシュ内でフラグメントが有効な時間を秒単位で指定します。この属性のデフォルト値は300秒(5分)です。
varyBy
スペース区切りの要素リスト。キャッシュするフラグメントのバージョン範囲を、スペース区切りの要素リストとして指定します。これらの要素によって、ページまたはフラグメントの出力が変化します。

これらの要素には、HTTPリクエスト・ヘッダー、Cookie、埋込みURLパラメータ、国のロケール、ユーザー・セッションまたはBeanプロパティを指定できます。式言語(EL)に類似した各要素は、varyBy_param.varyBy_param_valueのように表され、次の組合せが可能です。

varyBy_param. varyBy_param_valueは、ドット表記法で指定する必要があります。varyBy="cookie[name]"などの配列表記法はサポートされません。たとえば、varyBy="cookie.user_name"では、リクエストのuser_name Cookieの値に基づいてフラグメントがキャッシュされます。

この属性が存在しない場合は、NULL値にデフォルト設定され、フラグメントの1つのバージョンのみがキャッシュされます。

param.param_nameでは、POSTボディ・パラメータはサポートされません。この要素は埋込みURLパラメータに限定されます。

managed_bean.propertyで変化させる場合は、getProperty()メソッドが、時間のかかる計算を実行していないことを確認してください。時間のかかる計算を実行している場合は、キャッシュのメリットがありません。このような場合は、managed_bean .propertyで変化させないでください。

searchKeys
スペース区切りのリスト。プログラムによるフラグメントの失効化に使用する検索キーを指定します。

検索キーは、Webページとフラグメントを様々なグループに編成するために使用します。特定グループのすべてのページに同じ検索キーを割り当てることができます。たとえば、検索キーbusiness_newsをビジネス・ニュースに関係するすべてのページに割り当てます。オブジェクトのグループを失効化するには、その特定グループに関連付けられている検索キーを指定した失効化リクエストを発行します。たとえば、失効化リクエストで検索キーbusiness_newsを指定すると、検索キーbusiness_newsが割り当てられたすべてのページが失効します。

1つのオブジェクトに複数の検索キーを割り当てることができます。たとえば、地方のスポーツ・チームに関する記事が掲載されているWebページには、検索キーlocal_newssports_newsを割り当てることができます。構成属性max-searchkeysに指定した検索キーの制限を超えないようにしてください。この制限を超えると、そのフラグメントは、キャッシュ・タグ・ハンドラによってキャッシュされなくなります。

cacheMissOnRePost
ブール値。<afc:cache>タグで再ポストを処理するかどうかを指定します。再ポストは、アプリケーションによるリフレッシュ操作の実行やJSFによる失効化エラーの送信など、同じページからのポスト・バックによるリクエストです。

現在のリクエストが再ポストの場合はキャッシュからコンテンツをレンダリングせず、かわりにJSFエンコーディングを実行するように<afc:cache>タグに指示する場合は、trueを指定します。つまり、このリクエストはキャッシュ・ミスとして処理されます。この値は、たとえば、問合せのリフレッシュなど、一部の計算を実行するボタンが含まれるフラグメントに適しています。

リクエストが再ポストの場合でもキャッシュからフラグメントをフェッチするように<afc:cache>タグに指示する場合は、falseを指定します。この値は、単純な選択メニューなどが含まれる場合に適しています。バリデータまたはコンバータが関連付けられている入力フィールドが含まれたフラグメントに対して、この属性をfalseに設定しないでください。

この属性のデフォルト値はtrueです。


リファレンス: ADF Faces Cacheコンポーネント
キャッシュの一貫性について
コンテンツの失効化
ADF Faces Cacheの構成について
キャッシュ可能なADFコンポーネントのセキュリティ設定について