1

使用 JSF 2.0:

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

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

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

更多细节:

  • 网络逻辑 10.3.2
  • 我的脸 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>

托管豆

@ManagedBean
public class Page1Controller
{

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

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

}
4

3 回答 3

3

将 web.xml 中的上下文参数 javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 从 true 更改为 false 解决了该问题。

于 2012-04-09T13:55:14.777 回答
0

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

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

于 2012-04-06T18:47:12.593 回答
0

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

如果用户编辑已填充数据的页面,则在一个 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!"));
    }
}

但是如果我们可以只使用“required=true”会更好。我们没有任何 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 设置,所以我认为这不是原因?

[编辑] 实际上我注意到它只是在 h:datatable 中输入的情况

于 2015-09-25T07:30:44.210 回答