Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 仅当按下特定命令按钮时,才根据需要验证输入_Validation_Jsf 2_Primefaces_Required_Commandbutton - Fatal编程技术网

Validation 仅当按下特定命令按钮时,才根据需要验证输入

Validation 仅当按下特定命令按钮时,才根据需要验证输入,validation,jsf-2,primefaces,required,commandbutton,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}"/&

我有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>

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

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

我的要求是什么:

  • 当按下提交按钮时,应处理所有验证,这是正常的,工作正常
  • 当对输入字段触发模糊事件时,如果字段不为空,则应处理数字验证,这也是正常的。最后,我用id
    name
    和一些值更新字段
  • 现在我有一个问题。我的第三个请求是当输入为空时,不应处理对输入的验证。这是一种特殊情况,我将清除id为
    name
    的字段。当我删除输入中已经输入的文本、从组件中删除焦点(例如按TAB键)时也是这种情况,在这种情况下,还应该处理AJAX请求,并且名称输入也将被清除

  • 如何在输入字段为空时禁用该字段的验证,以及仅针对此ajax事件?

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

    <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>
    

    }

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


    但是,如果使用
    commandButton
    提交表单,则应处理所需的验证。当使用commandButton提交表单时,您的customValidator也将执行,如果输入的值不是数字,它将抛出异常;但如果输入是空的,它不会抱怨。好的,在请求1中我写道,当表单用按钮提交时,不能忽略required!我们可以说,当使用按钮提交时,该字段是必需的,但在模糊事件上使用ajax提交时,该字段不应是必需的。那么,您可以在验证器中检查该请求是否为ajax请求,并根据该字段处理您的输入。我更新了我的答案,向您展示了一个示例。正如您所看到的,这个Prmefaces
    commandButton
    也是AJAX:),所以它不能像那样处理。它应该是更健壮的组件(正如我所写的,它是复合组件的一部分)?为什么?只要您不填写(并因此更改)输入,验证就不会在blur上启动。也许我不清楚第三个请求中的具体用例。我编辑了它。用户可以(可能是意外地)删除文本,在这种情况下,名称输入将被清除。哦,这是出乎意料的。好的,只要让
    required
    属性检查是否按下了保存按钮。请参阅编辑后的答案。由于我使用
    @ViewScoped
    支持bean,我不希望使用
    绑定。也许可以使用一些
    f:param
    @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);
            }
        }
    }
    
    <h:form>
        <p:inputText ... required="#{not empty param[save.clientId] and myBean.required}" />
    
        <p:commandButton binding="#{save}" ... />
    </h:form>
    
    <h:form id="formId">
        <p:inputText ... required="#{not empty param['formId:buttonId'] and myBean.required}" />
    
        <p:commandButton id="buttonId" ... />
    </h:form>