就在我以为我立即理解的时候...*叹气*
考虑以下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}" />
Run Code Online (Sandbox Code Playgroud)
而这个支持bean:
public class TestBean {
private String didSomething = "Nothing done yet";
// + getter
public void doFoo() {
didSomething = "Did foo!";
}
public void doBar() {
didSomething = "Did bar!";
}
Run Code Online (Sandbox Code Playgroud)
从我所读到的所有内容中我可以期待以下内容:
当在没有为输入字段提供值的情况下尝试执行foo时,操作永远不会执行,因为在processValidationsPhase发生错误期间,导致在此阶段之后直接重新呈现页面并显示错误消息.didSomething保持不变的价值.(这按预期工作)
当在没有为输入字段提供值的情况下尝试执行bar时,applyRequestValuesPhase由于immediate属性而执行该操作.变量didSomething已更改.(这按预期工作)
接下来会发生什么,这个描述说明:
"null返回值(作为action方法的结果)导致处理继续正常进行,即验证非立即组件然后执行update-model(如果没有发生验证错误).对于返回void的动作侦听器方法,有必要调用facesContext.renderResponse();如果不需要正常流程."
由此我开始认为处理继续正常进行(因为我的动作方法既不返回结果也不返回力renderResponse()),导致相同的验证错误.唯一的区别是它在设置后发生didSomething.但是,这不会发生.相反,感觉网站仍然会跳过所有剩余的阶段,输入字段未被触及.它重新呈现没有错误消息. …