c:set 中的 EL 表达式被多次调用,而不是使用其返回值

Ash*_*ant 5 jsf jstl el jsf-2

我在请求范围内有一个操作。其方法之一的返回值被传递到自定义 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>
Run Code Online (Sandbox Code Playgroud)

someOther.xhtml(方法1)注意ProfileAction位于@RequestScoped中

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

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} 
Run Code Online (Sandbox Code Playgroud)

问题是 #{profileAction.getProfileMetadata(profileUri)} 正在为entityCard.xhtml中的每个属性评估调用然后,我想我应该将方法调用的返回值保存在ac:set var(方法2,如下所述)中,但它没有帮助。

someOther.xhtml(方法 2)

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

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

我还尝试了另一种方法,通过直接调用操作方法来解析 ui:param 本身的值,但没有任何效果。问题仍然存在。

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

Bal*_*usC 4

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

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

<c:set var="profileMetadata" scope="request"
       value="#{profileAction.getProfileMetadata(profileUri)}" />
Run Code Online (Sandbox Code Playgroud)