我希望在使用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
提前感谢您的帮助!
答案 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>
另外,我建议为事件toggle
,listener
和action
中的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;使用commandButton的整个空表单,对必填字段的验证失败。它的值保持为&#34;提交值&#34;,在这种情况下显然为空。其他空字段没有验证。它是否仍然区分本地值和提交的值?它是否将其本地值设置为&#34;为空&#34;或&#34; null&#34;?由于验证失败,模型不会更新,并且正在呈现表单时出现所需但空字段的错误。
然后设置另一个输入,通过ajax提交,滥用其setter方法设置其他输入的模型值并再次呈现整个表单。在该渲染期间,先前无效的空字段似乎将提交的和本地值设置为&#34; null&#34;,因为正在渲染模型的新值而不是空字段。然而,之前为空但不是必需的字段被渲染为空,尽管它的值只是空的或者是&#34; null&#34;作为验证字段的一个。如果将提交的和本地值设置为&#34; null&#34;,我希望它在渲染后也显示模型的值。
空字段的本地值是否实际区分先前提交的&#34;空&#34;输入和&#34; null&#34;当验证允许空字段或不存在时?因此,在渲染过程中,再次显示空本地值而不是模型值?