就在我以为我立刻明白了……*叹息*
考虑以下 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!";
}
从我读到的关于立即的所有内容中,我期望以下内容:
当尝试在没有为输入字段提供值的情况下执行 foo 时,该操作永远不会执行,因为在
processValidationsPhase
发生错误期间,导致在此阶段之后直接重新渲染页面并显示错误消息。的值didSomething
保持不变。(这按预期工作)当尝试在不为输入字段提供值的情况下执行 bar 时,
applyRequestValuesPhase
由于 immediate 属性,该操作将在 during 期间执行。变量didSomething
已更改。(这按预期工作)
关于接下来会发生什么,此描述指出:
“空返回值(作为操作方法的结果)导致处理正常继续,即验证非立即组件然后执行更新模型(如果没有发生验证错误)。对于返回 void 的操作侦听器方法,如果不需要正常流程,则有必要调用 facesContext.renderResponse();。”
由此我认为处理会继续正常进行(因为我的操作方法既不返回结果也不返回 force renderResponse()
),从而导致相同的验证错误。唯一的区别是它发生在设置之后didSomething
。但是,这不会发生。相反,感觉网站仍然跳过了所有剩余的阶段,没有触摸输入字段。它重新渲染而没有错误消息。
有人可以向我解释我对它是如何工作的理解有问题吗?