为什么JSF需要验证错误将输入字段替换为其原始值

时间:2012-04-06 18:33:03

标签: jsf-2

使用JSF 2.0:

用户使用输入字段加载页面,该输入字段绑定到具有现有值的辅助bean字段。输入字段已标记为必需。如果用户然后清空该字段并提交表单,则会按预期显示所需的消息,但是在呈现页面时该字段的值将替换为其原始值,而不是将该字段留空。

此行为似乎与字段上存在格式验证错误(与所需验证错误相比)时发生的情况不一致,例如如果有一个字段供用户在页面上输入链接到电子邮件格式验证器的电子邮件地址,并且用户替换当页面加载了无效的电子邮件地址时填写的现有有效电子邮件地址提交表单后,将显示验证错误消息,并且电子邮件地址字段的当前值将保持不变(并且在加载页面时不会替换为其原始值)。

当发生必填字段验证错误而不是重新加载其原始(非空白)值时,是否有任何方法可以将字段留空?

更多详情:

  • Weblogic 10.3.2
  • MyFaces 2.0.12

JSF页面:

<h:form>
  <h:messages showSummary="true"/>
  <h:inputText value="#{page1Controller.firstName}" 
               required="true" 
               requiredMessage="You must enter a first name"/>
  <h:commandButton value="Submit"/>
</h:form>

Managed Bean

@ManagedBean
public class Page1Controller
{

    public String getFirstName()
    {
        return "Default Value";
    }

    public void setFirstName(String value)
    {
        // no-op (for example purposes only)
    }

}

3 个答案:

答案 0 :(得分:3)

将web.xml中的context-param javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL从true更改为false修复了该问题。

答案 1 :(得分:0)

您的支持bean的范围是什么?

问题可能与范围有关,因为Bean可以在验证错误后重新加载,导致输入字段显示原始Bean的值

答案 2 :(得分:0)

我有同样的问题 (Glassfish with Mojarra 2.2.7)

如果用户编辑了已填充数据的页面,那么在一个selectOneMenu中,他选择空选项,当他提交时,他得到验证错误(字段为空),然后返回值。

为了解决这个问题,我添加了这个:

<h:selectOneMenu value="#{myBean.value}" validator="#{myBean.required}">
 <f:selectItem itemValue="#{null}" itemLabel="" />
 <f:selectItems value="#{myBean.list}" />
</h:selectOneMenu>

 public void required(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if(value == null) {
        ((UIInput) component).setValue(null);
        ((UIInput) component).setValid(false);
        throw new ValidatorException(new FacesMessage("Empty!"));
    }
}

但如果我们可以使用&#34; required = true&#34;会更好。 我们没有INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL的任何设置,所以我不认为这是什么原因?

[编辑] 实际上我注意到只有输入h:datatable

的情况