Validation 仅当按下特定命令按钮时,才根据需要验证输入
我有JSF验证的特定用例。例如,我有一个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}"/&
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}"/>
我的要求是什么:
name
和一些值更新字段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请求,并根据该字段处理您的输入。我更新了我的答案,向您展示了一个示例。正如您所看到的,这个PrmefacescommandButton
也是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>