Jsf 试图理解即时性=";“真的”;在不应输入时跳过输入';T
就在我以为我已经明白的时候*叹息* 考虑以下JSF页面:Jsf 试图理解即时性=";“真的”;在不应输入时跳过输入';T,jsf,commandbutton,immediate-attribute,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
<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}" />
从我所读到的有关immediate的所有信息中,我预计如下所示:
- 当尝试执行foo而不为输入字段提供值时,操作将永远不会执行,因为在
期间发生错误,导致页面在该阶段之后直接重新呈现,并显示错误消息。processValidationsPhase
的值保持不变。(如预期的那样)didSomething
- 当尝试在不为输入字段提供值的情况下执行bar时,由于immediate属性,该操作在
期间执行。变量ApplyRequestValuesPase
已更改。(如预期的那样)didSomething
renderResponse()
),从而导致相同的验证错误。唯一的区别是它发生在设置didSomething
之后但是,这并没有发生。相反,感觉站点仍然跳过了所有剩余的阶段,输入字段没有被触摸。它重新呈现,没有错误消息
有人能向我解释一下我对该操作的理解有何错误吗?使用按钮上的immediate=“true”
,该操作确实在应用请求值阶段被调用,其余所有阶段都被跳过。这也是该属性的唯一要点:在应用请求值阶段立即处理(解码、验证、更新和调用)组件
所有没有immediate=“true”
的输入都将被忽略。只有具有immediate=“true”
的输入也会被处理,但在应用请求值阶段也会发生这种情况。如果应用请求值阶段中已经发生了所有事情,那么为什么要调用其余阶段
在这篇文章中,您可以找到以下总结,这些总结应该会启发您何时(不)使用立即“true”
:
好的,我应该什么时候使用immediate属性?
如果还不完全清楚,这里有一个总结,包括可能有益的实际使用示例:
- 如果仅在
(s)中设置,则流程验证阶段将在应用请求值阶段进行。使用此选项可对所讨论的UIInput
组件的验证进行优先级排序。当其中任何组件的验证/转换失败时,将不会验证/转换非即时组件UIInput
- 如果仅在
中设置,则对于任何UICommand
组件,将跳过应用请求值阶段直到更新模型值阶段。使用此选项可以跳过表单的整个处理过程。例如,“取消”或“返回”按钮UIInput
- 如果在
和UIInput
组件中都进行了设置,则对于未设置此属性的任何UICommand
组件,将跳过“应用请求值”阶段直到“更新模型值”阶段。使用此选项可以跳过整个表单的处理,但某些字段除外(使用immediate)。例如,登录表单中的“忘记密码”按钮,带有必填但非即时的密码字段UIInput
immediate=“true”
)实际上处理用户名(因为它有immediate=“true”
),但没有密码(因为它没有immediate=“true”
)。它基本上将登录表单作为密码遗忘表单重用。使用GET link/按钮,您需要按两次某个按钮(一个按钮转到忘记密码的表单,另一个按钮提交该表单),如果您没有将用户名作为请求参数传递,甚至可能需要重新输入用户名。
public class TestBean {
private String didSomething = "Nothing done yet";
// + getter
public void doFoo() {
didSomething = "Did foo!";
}
public void doBar() {
didSomething = "Did bar!";
}