我有一个带有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'])}
)被渲染之前被求值。