4

リクエストスコープにアクションがあります。そのメソッドの 1 つの戻り値は、カスタム facelet タグに渡されます。このタグは、返されたオブジェクトのいくつかの属性を抽出して表示します。問題は、返されたオブジェクトの属性を評価するたびにアクションのメソッド呼び出しが呼び出される EL 式です。関連するコードをここに置きます。

some.xhtml

<ui:include src="someOther.xhtml">
    <ui:param name="profileUri" value="#{param['relateToProfile']}"/>
    <ui:param name="qualifier" value="#{param['qualifier']}"/>
    <ui:param name="cellStyleClass" value="#{param['cellStyle']}"/>
</ui:include>

someOther.xhtml (アプローチ 1) ProfileAction が @RequestScoped にあることに注意してください

<tenui:entityCard profileEntity="#{profileAction.getProfileMetadata(profileUri)}"
  qualifier="#{qualifier}"   
  cellStyleClass="#{cellStyleClass}"/>

enityCard.xhtml(facelet カスタムタグ)

<ui:fragment rendered="#{profileEntity.featured}">...
<tenui:gridCell id="#{profileEntity.profileId}#{qualifier}" ...      
 <tenui:metaunit ..content="#{profileEntity.getMeta('memberName')}" 
  href="/#{profileEntity.profileDisplayUri}" 
  hrefStyleClass="a-styled grid-cell-name"/>
  .....
  ...several other EL expressions including #{profileEntity.xxx} 

問題は #{profileAction.getProfileMetadata(profileUri)} が entityCard.xhtml のすべての属性評価に対して呼び出されていることです。次に、メソッド呼び出しの戻り値を ac:set var(approach 2 as below) に保存しようと考えましたが、役に立ちません。

someOther.xhtml (アプローチ 2)

<c:set var="profileMetadata" 
       value="#{profileAction.getProfileMetadata(profileUri)}"/>
<tenui:entityCard profileEntity="#{profielMetadata}"
  qualifier="#{qualifier}"   
  cellStyleClass="#{cellStyleClass}"/>

アクション メソッドは、非常に高価なストアド プロシージャを呼び出します。返されるオブジェクトには、entityCard.xhtml の EL で評価される 20 を超える属性があります。

アクションメソッドを直接呼び出すことで ui:param 自体の値を解決する別のアプローチも試しましたが、まったく役に立ちませんでした。問題は残りました。

誰かが私が間違っている可能性があることを指摘できますか? または、どうすれば profileAction.getProfileMetadata 呼び出しへの複数の呼び出しを回避できますか?

4

1 に答える 1

4

scopeの属性を、<c:set>目的のスコープ、、、requestまたはのいずれかに設定する必要があります。それ以外の場合、デフォルトはです。viewsessionapplicationnone

にしたい場合request、これは次のようにする必要があります。

<c:set var="profileMetadata" scope="request"
       value="#{profileAction.getProfileMetadata(profileUri)}" />
于 2013-04-04T12:02:39.847 に答える