4

我在请求范围内有一个动作。其方法之一的返回值被传递给自定义 facelet 标记。这个标签然后提取返回对象的几个属性并显示它们。问题是对于返回对象的属性的每次评估都会调用对 Action 进行方法调用的 EL 表达式。我将把相关的代码放在这里。

一些.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 如下所述) 但它没有帮助。

someOther.xhtml(方法 2)

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

action 方法调用一个非常昂贵的存储过程,并且返回的对象有超过 20 个属性,这些属性在 entityCard.xhtml 中的 EL 中进行评估。

我还尝试了另一种方法,通过直接调用 action 方法来解决 ui:param 本身的值,但根本无济于事。问题依然存在。

有人可以指出我做错了什么吗?或者,我如何避免多次调用 profileAction.getProfileMetadata 调用?

4

1 回答 1

4

您需要将 的scope属性设置<c:set>为所需范围之一,requestviewsessionapplication。否则默认为none.

假设您希望它是request,这应该是:

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