仅在按下某个命令按钮时才根据需要验证输入

时间:2013-02-06 13:13:44

标签: validation jsf-2 primefaces required commandbutton

我有JSF验证的特定用例。例如,我有一个inputText字段:

<p:inputText id="input" required="#{myBean.required}" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}">
  <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/>
</p:inputText>

输入值是数字(在某些情况下,它也可以是一个字符串,因为这是复合组件的一部分,但如果我们假设这是一个数字,则会更好地描述问题)。此输入是表单的一部分,在表单的末尾我有提交按钮:

<p:commandButton value="Save" actionListener="#{myBean.save}"/>

我的要求是什么:

  1. 当按下提交按钮时,应该处理所有验证,这没关系,这样可以正常工作。
  2. 当输入字段触发blur事件时,如果字段不为空,则应处理数字验证,这也是正常的。最后,我更新了标识为name的字段,其中包含一些值。
  3. 现在我遇到了问题。我的第三个请求是当输入为空时,不应处理输入验证。这是特殊情况,我将清除标识为name的字段。当我删除已在输入中输入的文本,从组件中删除焦点(例如按TAB)时也会出现这种情况,在这种情况下,也应该处理AJAX请求,并且还将清除名称输入。
  4. 如果输入字段为空,我是如何禁用此输入字段的验证的,只是为了这个ajax事件?

2 个答案:

答案 0 :(得分:10)

让输入的required属性检查是否按下了保存按钮(可以通过请求参数映射中存在客户端ID来识别)。

<h:form>
    <p:inputText ... required="#{not empty param[save.clientId] and myBean.required}" />

    <p:commandButton binding="#{save}" ... />
</h:form>

(注意:将它绑定到bean属性!代码是原样的)

这样,它只会在实际按下保存按钮时评估true

或者,如果您遇到binding的问题和/或没有问题,那么对按钮的客户端ID进行硬编码:

<h:form id="formId">
    <p:inputText ... required="#{not empty param['formId:buttonId'] and myBean.required}" />

    <p:commandButton id="buttonId" ... />
</h:form>

答案 1 :(得分:2)

如果输入为空,则在接受输入时删除所需的属性。然后编写一个自定义验证器,它只接受空输入或数字输入。

<p:inputText id="input" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}" validator="customerNumericInputValidator">   <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText>

公共类customerNumericInputValidator实现Validator {

@Override
public void validate(FacesContext facesContext, UIComponent uIComponent,
        Object object) throws ValidatorException {

    String number = (String) object;
    number = Strings.nullToEmpty(number).trim();

    //if the request is a full request then number can not be empty
    if(!FacesContext.getCurrentInstance().isPostback() && Strings.isNullOrEmpty(number))
    {
         FacesMessage message = new FacesMessage();
         message.setSummary(Messages.getMessage("error empty value"));
         message.setSeverity(FacesMessage.SEVERITY_ERROR);
         throw new ValidatorException(message);
    } 

    if(!Strings.isNullOrEmpty(number))
    { 
        if(!isNumber(number))
        {
           FacesMessage message = new FacesMessage();
           message.setSummary(Messages.getMessage("error not numerical value"));
           message.setSeverity(FacesMessage.SEVERITY_ERROR);
           throw new ValidatorException(message);
        }
    }
}

}