当前位置: 首页 > 知识库问答 >
问题:

试图理解immediate=“true”在不应该的时候跳过输入

邬宜然
2023-03-14

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

<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}" />
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的值保持不变。(按预期工作)

    当尝试do bar而不为输入字段提供值时,由于immediate属性,该操作将在applyRequestValuesPhase期间执行。变量DidSomething已更改。(按预期工作)

    “null返回值(作为action方法的结果)会导致处理正常继续,即验证非立即组件,然后执行update-model(如果没有发生验证错误)。对于返回void的action侦听器方法,需要调用FacesContext.RenderResponse();如果不需要正常流。”

    由此,我产生了这样的想法,即处理继续正常(因为我的action方法既不返回结果,也不强制renderresponse()),从而导致相同的验证错误。唯一的区别是它发生在设置didsomething之后。然而,这种情况并不发生。相反,它感觉站点仍然跳过所有剩余的阶段,输入字段没有被触摸。它重新呈现时不会出现错误消息。

    谁能给我解释一下,我对这个工作原理的理解哪里出了问题?

  • 共有1个答案

    武睿
    2023-03-14

    按钮上有immediate=“true”时,在apply request values阶段确实会调用该操作,并且会跳过所有剩余的阶段。这也是该属性的唯一要点:在apply request values阶段立即处理(解码、验证、更新和调用)组件。

    所有没有immediate=“true”的输入都将被忽略。只有具有immediate=“true”的输入才会被处理,但在apply request values阶段也会发生这种情况。如果apply request values阶段已经发生了一切,为什么还要调用其余的阶段?

    在Debug JSF lifecycle文章中,您可以找到以下摘要,它将启发您何时(不)使用立即“true”:

    如果还不完全清楚,这里有一个总结,并提供了一些有用的实际应用示例:

    >

  • 如果仅在UIInput(s)中设置,则进程验证阶段将改为在apply request values阶段进行。使用此方法可以确定有问题的UIInput组件的验证优先级。当任何一个组件的验证/转换失败时,非直接组件将不会被验证/转换。

    如果仅在UICommand中设置,则将跳过任何UIInput组件的“应用请求值”阶段直至“使用更新模型值”阶段。使用此选项可跳过窗体的整个处理过程。例如。“取消”或“后退”按钮。

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

    • 为什么将“immediate”属性添加到EditableValueHolders?

  •  类似资料:
    • 我目前正在系统中使用JwtSecurityToken类。标识模型。令牌命名空间。我使用以下内容创建令牌: 出于某种原因,即使过期时间设置为当前时间后10秒,当令牌被验证到大约5分钟时,它实际上不会引发异常。看到这个后,我想可能有5分钟的最低过期时间,所以我将过期时间设置为: 然后,它将在10分钟后过期,但异常消息表示过期时间设置为应该的时间(用户登录后5分钟),当它在异常中显示当前时间时,则为过期

    • 问题内容: 我莫名其妙地迷糊了自己。 不知何故,我想到用AJAX(如$ .post)打PHP时,您必须回显“ true”或“ false”,而不是返回true / false。我现在知道不是这种情况,但是有人可以为我分解吗? 测试布尔值是否存在问题?像这儿 那是有问题的情况,对吗?在这里,我不能返回true / false,而是必须回显一个字符串并测试该字符串,是吗? 但是我看到布尔true /

    • 有没有人遇到过使用场景?由于是默认选项,我看不到你什么时候会使用它。

    • 在eclipse中,它将始终运行测试

    • 我已阅读文档。但我仍然不确定何时不需要将其设置为 。在下面的代码中,如果我将其设置为 ,我根本看不到标头。如果我把它留,那么一切都很好。 以下视图调试层次结构将发出警告“宽度和位置不明确”。 我想每当我需要修改代码中的任何内容时,我都必须将设置为。 也许更正确的说法是,如果您需要删除它的所有约束,然后将其设置为< code>false,然后添加您喜欢的内容,在这种情况下,您需要为所有4条边添加约束

    • 问题内容: 我已经阅读了文档。但我仍然不确定何时不需要将其设置为。在下面的代码中,如果将其设置为,则根本看不到标题。如果我将其保留为,那么一切都很好。 View调试层次结构中的以下内容将给出警告“ 宽度 和 位置 不明确”。 我以为只要需要修改代码中的任何内容,都必须设置为。 如果您需要删除其所有约束,然后将其设置为,然后添加所需的内容,则可能是更正确的说法,在这种情况下,您需要为所有四个方面添加