Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 试图理解即时性=";“真的”;在不应输入时跳过输入';T_Jsf_Commandbutton_Immediate Attribute - Fatal编程技术网

Jsf 试图理解即时性=";“真的”;在不应输入时跳过输入';T

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

就在我以为我已经明白的时候*叹息*

考虑以下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}" />
从我所读到的有关immediate的所有信息中,我预计如下所示:

  • 当尝试执行foo而不为输入字段提供值时,操作将永远不会执行,因为在
    processValidationsPhase
    期间发生错误,导致页面在该阶段之后直接重新呈现,并显示错误消息。
    didSomething
    的值保持不变。(如预期的那样)

  • 当尝试在不为输入字段提供值的情况下执行bar时,由于immediate属性,该操作在
    ApplyRequestValuesPase
    期间执行。变量
    didSomething
    已更改。(如预期的那样)

关于接下来会发生什么,声明:

空返回值(作为操作方法的结果)导致处理正常继续,即验证非即时组件,然后执行更新模型(如果没有发生验证错误)。对于返回void的操作侦听器方法,如果不需要正常流,则必须调用facesContext.renderResponse()

从这一点上,我的想法是处理继续正常进行(因为我的操作方法既不返回结果也不强制
renderResponse()
),从而导致相同的验证错误。唯一的区别是它发生在设置
didSomething
之后但是,这并没有发生。相反,感觉站点仍然跳过了所有剩余的阶段,输入字段没有被触摸。它重新呈现,没有错误消息

有人能向我解释一下我对该操作的理解有何错误吗?

使用按钮上的
immediate=“true”
,该操作确实在应用请求值阶段被调用,其余所有阶段都被跳过。这也是该属性的唯一要点:在应用请求值阶段立即处理(解码、验证、更新和调用)组件

所有没有
immediate=“true”
的输入都将被忽略。只有具有
immediate=“true”
的输入也会被处理,但在应用请求值阶段也会发生这种情况。如果应用请求值阶段中已经发生了所有事情,那么为什么要调用其余阶段

在这篇文章中,您可以找到以下总结,这些总结应该会启发您何时(不)使用
立即“true”

好的,我应该什么时候使用immediate属性? 如果还不完全清楚,这里有一个总结,包括可能有益的实际使用示例:

  • 如果仅在
    UIInput
    (s)中设置,则流程验证阶段将在应用请求值阶段进行。使用此选项可对所讨论的
    UIInput
    组件的验证进行优先级排序。当其中任何组件的验证/转换失败时,将不会验证/转换非即时组件

  • 如果仅在
    UICommand
    中设置,则对于任何
    UIInput
    组件,将跳过应用请求值阶段直到更新模型值阶段。使用此选项可以跳过表单的整个处理过程。例如,“取消”或“返回”按钮

  • 如果在
    UIInput
    UICommand
    组件中都进行了设置,则对于未设置此属性的任何
    UIInput
    组件,将跳过“应用请求值”阶段直到“更新模型值”阶段。使用此选项可以跳过整个表单的处理,但某些字段除外(使用immediate)。例如,登录表单中的“忘记密码”按钮,带有必填但非即时的密码字段

另见:

还有哪些阶段?在调用操作阶段之后,只剩下一个阶段:呈现响应阶段。除了给出响应,您还希望发生什么?相关:即时按钮的操作不是在调用期间调用的,而是在ApplyRequestValues的末尾调用的,对吗?因此,如果它不干扰正常的流程,那么还应该有ProcessValidations、UpdateModel和InvokeActions?我明白你的意思了。我发布了答案。我用链接来源的引用更新了问题。如果我错了,请纠正我,但是他们的描述和你的描述给出了不同的图片——你的描述与实际行为相符。他们的有些错误吗?显然MyFaces中有一个错误,文章作者观察到它的行为是正确的。的第2.5.1节非常可读,并且支持BalusC的出色解释。我认为最后一个项目符号中给出的示例,“例如,登录表单中的“密码遗忘”按钮,带有一个必需但非即时的密码字段。”与第二颗子弹非常匹配。当按下该按钮时,表格中的任何内容都不应被验证。(大多数在实际应用程序中,应该有一个链接来代替直接导航到密码恢复页面的按钮)。@Tiny:“忘记密码”按钮(带有
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!";        
}