JSF页面中的EL评估不是顺序的

时间:2013-04-05 08:21:59

标签: jsf jsf-2 facelets el

我有一个带有ui:composition标签的XHTML,我正在加载AJAX。我正在使用jQuery Ajax GET来加载此XHTML的URL。在加载的页面中,我有一个EL表达式,然后我还包括另一个有更多EL表达式的源代码。不可避免的是,所包含来源的EL表达式的评估时间早于出现之前的EL表达式。

Some.xhtml

<ui:composition ...
    #{relationshipAction.followMember(param['relateToProfile'])}
    <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中的任何EL之前评估#{relationshipAction.followMember(param['relateToProfile'])}。但是,someOther.xhtml中的EL总是首先得到评估。

知道可能出现什么问题吗?

3 个答案:

答案 0 :(得分:1)

规范没有说EL表达式是按文本顺序评估的。组件可以自由地在其选择的JSF生命周期的任何阶段评估EL表达式。它也可以在特定情况下进行评估,甚至可以多次评估。

除了规范实际定义的罕见情况之外,您不应该假设任何特定订单。在您的情况下,JSF 2.2的viewAction组件或preRenderView事件可能更适合。我认为BalusC explains的使用相当可读。

答案 1 :(得分:1)

You should stop doing business logic in getter methods

使用bean的(post)构造函数或(action)侦听器方法。 Bean属性必须返回已准备好的值。我昨天回答了一个问题,其中OP犯了同样的概念错误。您可能会发现它也很有用:Bean methods execution precedence in JSF

答案 2 :(得分:0)

您需要知道的一件非常重要的事情是

<ui:include> is evaluated during view build time, not during view render time

因此,<ui:include>评估之前您的视图(包含#{relationshipAction.followMember(param['relateToProfile'])})已呈现。