メタデータの末尾に移動
メタデータの先頭に移動

MyFaces Core 2.0.8 / 2.1.2 以降では、不要な EL 式の作成を抑制する最適化機能が新しく追加されています。ページが構築されるたびに、Facelets コンパイラはすべての EL 式を作成し、ついでこれを評価します。したがって、新しく追加されたこの特別な機能を使えば、ビューを構築するのに必要な時間とメモリを減らすことができます。具体的には、web.xml ファイルに次のような設定を追加します。

      <context-param>
        <param-name>org.apache.myfaces.CACHE_EL_EXPRESSIONS</param-name>
        <param-value>always</param-value>
      </context-param>

このパラメータで有効なモードは、以下の 4 つです。

  • always: 式がユーザータグの内部のある場合、または VariableMapper を使って解決される変数が式に含まれている場合にのみ、キャッシュを行いません。
  • allowCset: always に似ていますが、現在のテンプレートコンテキスト上で ui:param が使われた場合にはキャッシュを許可しません。
  • strict: allowCset に似ていますが、var プロパティと value プロパティだけを伴う c:set が現在のページコンテキスト上で使われている場合にはキャッシュを許可しません。
  • noCache: ビューが構築されるたびにすべての式が作成されます。

この最適化機能を有効にするには、いくつかの点をチェックして、実行するアプリケーションでどのモードを有効にできるのかを調べる必要があります。

理論上、"always" モードは次のケースでは動作しません。

a.xhtml
<ui:composition template="c.xhtml">
    <ui:param name="var1" value="value1"/>
</ui:composition>
b.xhtml
<ui:composition template="c.xhtml">
    <ui:param name="var1" value="value1"/>
    <ui:param name="var2" value="value2"/>
</ui:composition>
c.xhtml
<ui:composition>
   <h:outputText value="#{var1}/>
   <h:outputText value="#{var2}/>
</ui:composition>

a.xhtml のビューが b.xhtml より前に構築される場合、たとえそれが望まれる動作でなくても #{var2} がキャッシュされます。その後、b.xhtml が呼び出されると、式は正しく動作しません。

したがって、このパラメータの使用に関して最初にチェックするべきポイントは、composition 宣言 (ui:include、ui:decorate、ui:composition) で常に同じ数のパラメータが使われているかどうかを調べることです。

"allowCset" モードと "always" モードは、次のケースでも動作しません。

csetuse.xhtml
	<c:if test="....">
		<c:set var="attribute1" value="somevalue" />
	</c:if>

        <!-- some use of attribute1 -->

この場合の問題は、値式が条件付きで作成されるようになっていて、式が最初に作成されなかった場合には、ほかの値式がキャッシュ可能とマークされないことです。

この問題は、次の構文を使うことで回避できます。

csetuse.xhtml
    <c:set var="attribute1" value="#{somecondition ?'somevalue' : null}"/>

こうすれば、attribute1 が使われれば、式が検出されて適切に処理されます。

"strict" モードでは、先の 2 つのタグ (c:if と ui:param) が使われている場合、内部の EL 式のキャッシュを抑制します。デフォルトの "noCache" モードでは、ビューが構築されるたびに必ず式が再作成されます。

関連する課題: MYFACES-3160

Enter labels to add to this page:
Please wait 
Looking for a label?Just start typing.