无论如何在输入时使用required =" true"将空值提交给bean。

时间:2015-06-01 07:42:43

标签: ajax jsf jsf-2 primefaces required

我使用required="true"输入以下内容:

<p:inputText value="#{bean.value}" required="true">
    <p:ajax event="change" listener="#{bean.change()}" />
</p:inputText>

当用户更改值时,将触发侦听器,我可以访问更改的值。当用户清空该字段时,不会触发侦听器,并且我的bean中的空值不会更新。我认为这是由requried="true"引起的。我想用空值更新我的bean,并在用户清空该字段时触发监听器。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

您也可以在required属性中使用表达式语言(EL)。然后,您可以检查是否已按下表单的主提交按钮。想象一下,您的表单有一个“保存”按钮,如下所示,

<p:inputText ... required="true">
    <p:ajax ... />
</p:inputText>
...
<p:commandButton ... action="#{bean.save}" />

然后,只有在调用按钮时,才能让required属性评估true。您可以通过binding引用组件并检查其客户端ID是否存在于HTTP请求参数映射中来实现:

<p:inputText ... required="#{not empty param[save.clientId]}">
    <p:ajax ... />
</p:inputText>
...
<p:commandButton binding="#{save}" ... action="#{bean.save}" />

请注意#{save}是原样的,绝对不能绑定到支持bean,并且变量名在当前视图和EL范围内必须是唯一的。

另见:

答案 1 :(得分:0)

问题是如果用户清除了所需的输入字段,那么'required'验证器会抛出异常,并且不会调用bean setter。重新加载表单后,清除的值将再次从bean中显示。这是我的解决方法:

public String getSomething() {
    return isFormValueEmpty("form:something") ? null : this.something;
}

private Boolean isFormValueEmpty(String formFieldName) {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    String formValue = ec.getRequestParameterMap().get(formFieldName);
    logger.debug("Check if form value is empty: [{}] [{}]", formFieldName, formValue);
    return StringUtils.isEmpty(formValue);
}