刚刚我以为我已经理解了立即执行函数... *叹气*
考虑下面的JSF页面:
<h:inputText value="#{testBean.text}" required="true" />
<h:commandButton actionListener="#{testBean.doFoo}" value="Do Foo" />
<h:commandButton immediate="true" actionListener="#{testBean.doBar}" value="Do Bar" /><br />
<h:outputText value="#{testBean.didSomething}" />
并且这是一个后端Bean:
public class TestBean {
private String didSomething = "Nothing done yet";
// + getter
public void doFoo() {
didSomething = "Did foo!";
}
public void doBar() {
didSomething = "Did bar!";
}
根据我所阅读的有关immediate的所有内容,我期望以下结果:
当尝试执行foo操作时,而没有为输入字段提供值时,在
processValidationsPhase
期间会发生错误,因此该操作不会被执行,直接在该阶段之后使用错误消息重新呈现页面。变量didSomething
的值保持不变。(这符合预期)当尝试执行bar操作时,而没有为输入字段提供值时,由于设置了immediate属性,该操作将在
applyRequestValuesPhase
期间执行。变量didSomething
会被更改。(这符合预期)
关于接下来会发生什么,这个描述指出:
"空返回值(作为操作方法的结果)会使处理继续进行,即非立即组件将得到验证,然后更新模型(如果没有发生验证错误)。对于返回void的操作监听器方法,有必要调用facesContext.renderResponse();如果不需要正常流程,则必须调用facesContext.renderResponse()。"
基于此,我认为处理会像正常情况一样继续进行(因为我的操作方法既没有返回结果也没有强制使用renderResponse()
),导致相同的验证错误。唯一的区别是它发生在设置didSomething
之后。然而,事实并非如此。相反,感觉网站仍会跳过所有剩余阶段,输入字段不受影响。重新呈现页面时不会显示任何错误消息。
有人能否解释一下我的理解出了什么问题?