h:commandLink 操作和 f:ajax 侦听器的调用顺序

Call order of h:commandLink action and f:ajax listener

这是我的标记:

<h:commandLink value="#{partial}" action="#{hello.setCurrentPartial(partial)}">
    <f:ajax render="include" listener="#{hello.renderFragments}"/>
</h:commandLink>

我尝试在 Mojarra-2.2.8(wildfly 8.2.0.Final 内置)和 MyFaces-2.2.7(按照指导安装 here)中 运行 此页面.令人惊讶的是,当单击 link 时,mojarra 先调用 hello.renderFragments,然后调用 hello.setCurrentPartial,但 MyFaces 采用相反的顺序,即先调用 hello.setCurrentPartial

所以我的问题是在JSF Spec中是否有关于动作调用顺序和ajax监听器的定义。如果定义了顺序,哪种实现是正确的?

根据上面的 EG discussion, there's agreement on Mojarra behavior being correct as it's in line with how actionListener/action work. The MyFaces guy has created an issue,预计下一个 MyFaces 版本将修复此问题。而且,JSF 规范应该在这方面更加明确,这将得到解决。

同时,如果您希望 Mojarra 和 MyFaces 中的方法调用顺序具有相同的行为,请将 <f:ajax listener> 移动到 <h:commandLink actionListener>

<h:commandLink value="#{partial}" actionListener="#{hello.renderFragments}" action="#{hello.setCurrentPartial(partial)}">
    <f:ajax render="include" />
</h:commandLink>

另请参阅:

  • Differences between action and actionListener