尝试理解立即="真实"跳过输入,而不应该

Lou*_*ise 23 jsf commandbutton immediate-attribute

就在我以为我立即理解的时候...*叹气*

考虑以下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.但是,这不会发生.相反,感觉网站仍然会跳过所有剩余的阶段,输入字段未被触及.它重新呈现没有错误消息.

有人可以向我解释我对这是如何工作的理解是不对的吗?

Bal*_*usC 38

使用immediate="true"按钮,在应用请求值阶段确实调用了操​​作,并且跳过了所有剩余的阶段.这也是此属性的唯一要点:在应用请求值阶段期间立即处理(解码,验证,更新和调用)组件.

这是不是所有的投入immediate="true"被忽略反正.仅immediate="true"处理了具有的输入,但这也在应用请求值阶段期间发生.如果在申请请求值阶段已经发生了所有事情,为什么还要调用其余阶段?

Debug JSF生命周期文章中,您可以找到以下摘要,该摘要应该启用何时(不)使用immediate"true":

好的,什么时候应该使用immediate属性?

如果还不完全清楚,这里有一个摘要,当它们可能有益时,可以使用真实世界的使用示例:

  • 如果仅设置为UIInput(s),则过程验证阶段将在应用请求值阶段中进行.使用此选项可以优先验证相关UIInput组件的验证.当任何一个验证/转换失败时,将不验证/转换非直接组件.

  • 如果UICommand仅设置,则应用请求值阶段直到更新模型值将跳过任何UIInput组件的阶段.使用此选项可跳过表单的整个处理过程.例如"取消"或"后退"按钮.

  • 如果在两个组件UIInputUICommand组件中都设置了应用请求值阶段UIInput,那么对于没有设置此属性的任何组件,将跳过更新模型值阶段.使用此选项可以跳过对某些字段(即时)的整个表单的处理.例如,登录表单中的"忘记密码"按钮,其中包含必需但非直接的密码字段.

也可以看看:

  • @Tiny:"忘记密码"按钮(带有`immediate ="true"`)实际上处理用户名(因为它有`immediate ="true"`),但不是密码(因为它没有`immediate = "真"`).它基本上重用登录表单作为密码忘记表单.使用GET链接/按钮,您需要按两次按钮(一个用于忘记密码,另一个用于提交),如果您没有将其作为请求参数传递,甚至可能会重新输入用户名. (3认同)