提交/验证失败后无法使用支持bean setter自动填充字段

时间:2015-10-08 15:43:00

标签: validation jsf lifecycle managed-bean

我希望在使用ajax激活其中的复选框时自动填写表单(例如"使用帐单地址作为收货地址?")和支持bean的设置器。

因此,该复选框的支持bean的设置器' value设置其他字段,ajax重新显示整个表单。只要没有验证器发挥作用,这就有效。现在,我必须在某些字段中添加验证器。当以无效(在这种情况下为空)状态提交表单时,相应的验证失败。如果在此之后,将检查自动填充表单的复选框,并且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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分: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>

另外,我建议为事件togglelisteneraction中的h: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>

答案 1 :(得分:0)

很抱歉打破这里的礼节,并基本上将问题作为答案发布,但是在看了你指出的谷歌搜索结果后,评论允许用于制定情况和我的问题的字符太少。

BalusC写了一篇文章,最接近解释导致这种影响的jsf逻辑:http://balusc.omnifaces.org/2012/03/reset-non-processed-input-components-on.html

但是当我考虑以下几点时,仍然有一个细节,我不能在我的例子中理解:

  • 输入组件保留提交的和本地值。
  • 如上面的链接所述 - 验证字段中的值保持为&#34;提交的值&#34;如果无效,或被设置为&#34;本地值&#34;将提交的值设置为&#34; null&#34;。
  • 的组件
  • 渲染时,jsf首先检查提交的值,然后检查&#34; null&#34;的本地值。并显示第一个非null。仅当两者都为null时,才会呈现模型值。

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

然后设置另一个输入,通过ajax提交,滥用其setter方法设置其他输入的模型值并再次呈现整个表单。在该渲染期间,先前无效的空字段似乎将提交的和本地值设置为&#34; null&#34;,因为正在渲染模型的新值而不是空字段。然而,之前为空但不是必需的字段被渲染为空,尽管它的值只是空的或者是&#34; null&#34;作为验证字段的一个。如果将提交的和本地值设置为&#34; null&#34;,我希望它在渲染后也显示模型的值。

空字段的本地值是否实际区分先前提交的&#34;空&#34;输入和&#34; null&#34;当验证允许空字段或不存在时?因此,在渲染过程中,再次显示空本地值而不是模型值?