JSF页面中的EL计算不是顺序的



我有一个带有ui:composition标签的XHTML,我正在AJAX上加载它。我使用jQuery Ajax GET来加载这个XHTML的URL。在加载的页面中,我有一个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>

在这里,我希望#{relationshipAction.followMember(param['relateToProfile'])}在包含的someOther.xhtml中的任何EL之前被求值。但总是someOther.xhtml中的el先求值。

你知道哪里出错了吗?

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

你不应该假设任何特定的顺序,除非在极少数情况下,规范实际上定义了它。在您的情况下,JSF 2.2的viewAction组件或preenderview事件可能更适合您。我认为BalusC很好地解释了它们的用法。

你应该停止在getter方法中做业务逻辑。

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

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

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

因此,<ui:include>在视图(包含#{relationshipAction.followMember(param['relateToProfile'])})被渲染之前被求值

相关内容

  • 没有找到相关文章

最新更新