2015-10-08 17 views
0

我想在使用ajax激活其中的复选框(例如“使用账单地址作为传递地址?”)和后台bean的设置器时自动填写表单。未能在提交/验证失败后自动填充支持bean设置器的字段

因此,支持bean的setter为该复选框的值设置了其他字段,并且ajax具有rerenderd的整个表单。只要没有验证器发挥作用,它就可以工作。现在,我必须添加一个验证器到一些字段。当提交表单为无效(在这种情况下为空)状态时,相应的验证失败。如果在此之后,选中自动填充表单的复选框并且ajax再次提交表单,当表单被重新渲染时,只有经过验证的表单字段将被填充。所有其他字段保持空白,尽管后台bean应该设置它们。

为什么JSF只在验证失败一次后才渲染验证字段的支持bean值,而不是其他字段的值? JSF生命周期中的哪个逻辑负责这种行为?

这里有一个小例子:

@ManagedBean 
public class TestBean 
{ 
    private boolean toggle; 
    private String stringValue1; 
    private String stringValue2; 

    public boolean isToggle() { 
     return toggle; 
    } 
    public void setToggle(boolean toggle) { 
     this.toggle = toggle; 
     if(this.toggle) { 
      this.stringValue1 = "Value1"; 
      this.stringValue2 = "Value2"; 
     } 
    } 

    // ... the usual getters and setters 
} 

和相应的JSF表单:

<h:form id="testForm"> 
    <h:messages /> 

     <h:inputText value="#{testBean.stringValue1}"> 
      <f:validateRequired /> 
     </h:inputText> 

     <h:inputText value="#{testBean.stringValue2}" /> 

     <h:selectBooleanCheckbox id="toggleBox" value="#{testBean.toggle}"> 
      <f:ajax render="testForm" /> 
     </h:selectBooleanCheckbox> 

    <h:commandButton type="submit" value="Submit"> 
     <f:ajax execute="@form" render="testForm" /> 
    </h:commandButton> 
</h:form> 

first, the form is submitted without values

then the checkbox is checked

在此先感谢您的帮助!

+0

单独留下getter和setter,使用listeners。 – Geinmachi

+0

对不起,在这里钝... -_- 但我怀疑你的意思是描述的动作和/或valueChangeListener [here](http://docs.oracle.com/javaee/6/tutorial/doc/bnatn的.html#bnats)? 我添加了一个valueChangeListener属性到复选框和辅助bean中的一个方法,该方法设置了其他两个字段。效果依然如此。 – Burny

+0

选中其中一个是重复的:https://www.google.com/search?q=fields+not+reset+after+validation+failed – Kukeltje

回答

0

我不知道为什么会出现这种情况,但将没有正确刷新的组件(未经验证)添加到execute看起来像是解决方法。

<h:form id="testForm"> 
<h:messages /> 

    <h:inputText value="#{testBean.stringValue1}"> 
     <f:validateRequired /> 
    </h:inputText> 

    <h:inputText id="stringValue2" value="#{testBean.stringValue2}" /> 

    <h:selectBooleanCheckbox id="toggleBox" value="#{testBean.toggle}"> 
     <f:ajax render="testForm" execute="@this stringValue2" /> 
    </h:selectBooleanCheckbox> 

    <h:commandButton type="submit" value="Submit"> 
     <f:ajax execute="@form" render="testForm" /> 
    </h:commandButton> 
</h:form> 

此外,我建议做正常的setter方法togglelistener事件和actionh:commandButton这样

<h:form id="testForm"> 
<h:messages /> 

    <h:inputText value="#{testBean.stringValue1}"> 
     <f:validateRequired /> 
    </h:inputText> 

    <h:inputText id="stringValue2" value="#{testBean.stringValue2}" /> 

    <h:selectBooleanCheckbox id="toggleBox" value="#{testBean.toggle}"> 
     <f:ajax render="testForm" execute="@this stringValue2" listener="#{testBean.setValues}" /> 
    </h:selectBooleanCheckbox> 

    <h:commandButton action="#{testBean.formLogic}" value="Submit"> 
     <f:ajax render="testForm" /> 
    </h:commandButton> 
</h:form> 
+0

很多类似的问题,并解释了可能的原因:https:// www.google.com/search?q=fields+not+reset+after+validation+failed – Kukeltje

0

对不起,我在这里打破了礼仪和基本发布提问的答案,但评论允许因为在查看您指向的谷歌搜索结果之后,为了解释这种情况以及我的问题的字符太少了。

BalusC写过一篇文章是最接近解释造成这种效果的JSF逻辑:http://balusc.omnifaces.org/2012/03/reset-non-processed-input-components-on.html

但还是有一个细节,我不在我的例子的情况下明白了,当我考虑以下分数:

  • 输入组件保留提交的值和本地值。
  • 如上述链接所述 - 如果验证字段中的值无效,则保留为“已提交值”,或者将其提交值设置为“null”,将其值设为组件的“本地值”。
  • 渲染时,jsf首先检查提交的值,然后检查“null”的本地值,并显示第一个不为null的值。只有两者都为null时,模型值才会被渲染。

在我的示例中,当我用commandButton“执行”整个空表单时,所需字段的验证失败。它的值保持为“提交的值”,在这种情况下显然为空。没有验证其他空白字段。它是否仍然区分本地价值和提交价值?它是否将其本地值设置为“空”或“空”?由于验证失败,模型不会更新,并且表单正在渲染,但所需的空字段出现错误。

然后设置另一个输入,通过ajax提交,滥用其setter方法来设置其他输入的模型值并再次呈现整个表单。在渲染过程中,先前无效的空字段似乎将提交的值和本地值都设置为“null”,因为模型的新值正在呈现而不是空字段。然而,先前为空但不是必需的字段被呈现为空,尽管其值与验证字段的值一样为空或“空”。如果它的提交和本地值设置为“空”,我希望它也可以在渲染后显示模型的值。

当验证允许空字段或不存在时,空字段的本地值是否实际区分先前提交的“空”输入和“空”?所以在渲染过程中,空的局部值再次显示而不是模型值?

相关问题