日期范围验证

Chr*_*Geo 14 validation jsf date-range

我想比较两个日期(StartDate和EndDate)并检查一个日期是否在另一个日期之前.最简单的解决方案是在支持bean上执行此操作并将方法"短路".

但是,此验证不会与其他表单验证同时发生.例如,如果我有另一个需要验证的字段(除了日期)并且输入无效,我将只收到该特定字段的消息.只有当其他字段有效时,才会根据辅助bean获取日期验证.

有人有解决方案吗?

Bal*_*usC 34

但是,此验证不会与其他表单验证同时发生.

支持bean操作方法确实不打算执行输入验证.


有人有解决方案吗?

使用正确的工具; 使用正常Validator.

@FacesValidator("dataRangeValidator")
public class DateRangeValidator implements Validator {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然而,使用单个验证器验证多个输入值确实是一个故事.基本上,您应该抓取/传递其他组件或其值到validate()方法实现中.最简单的形式,您可以使用<f:attribute>它.假设您正在使用<p:calendar>日期,这是一个具体的启动示例:

<p:calendar id="startDate" binding="#{startDateComponent}" value="#{bean.startDate}" pattern="MM/dd/yyyy" required="true" />
<p:calendar id="endDate" value="#{bean.endDate}" pattern="MM/dd/yyyy" required="true">
    <f:validator validatorId="dateRangeValidator" />
    <f:attribute name="startDateComponent" value="#{startDateComponent}" />
</p:calendar>
Run Code Online (Sandbox Code Playgroud)

(注意该binding属性,它使EL范围内的组件在给定的变量名称上可用;另请注意,此示例是原样的,您绝对不应该将它绑定到bean属性!)

dateRangeValidator这个样子的:

@FacesValidator("dateRangeValidator")
public class DateRangeValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (value == null) {
            return; // Let required="true" handle.
        }

        UIInput startDateComponent = (UIInput) component.getAttributes().get("startDateComponent");

        if (!startDateComponent.isValid()) {
            return; // Already invalidated. Don't care about it then.
        }

        Date startDate = (Date) startDateComponent.getValue();

        if (startDate == null) {
            return; // Let required="true" handle.
        }

        Date endDate = (Date) value;

        if (startDate.after(endDate)) {
            startDateComponent.setValid(false);
            throw new ValidatorException(new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Start date may not be after end date.", null));
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您碰巧使用JSF实用程序库OmniFaces,那么您也可以使用它的<o:validateOrder>组件.无需自定义验证器即可按如下方式实现该要求:

<p:calendar id="startDate" value="#{bean.startDate}" pattern="MM/dd/yyyy" required="true" />
<p:calendar id="endDate" value="#{bean.endDate}" pattern="MM/dd/yyyy" required="true" />
<o:validateOrder components="startDate endDate" />
Run Code Online (Sandbox Code Playgroud)

也可以看看:


Jos*_*eJC 5

如果你使用PrimeFaces可以限制最小和最大日期.用户无法选择更大的范围这是一个例子:

<p:calendar id="startDate" value="#{bean.startDate}" maxdate="#{bean.endDate}">
     <p:ajax event="dateSelect" update="endDate"/>
</p:calendar>
<p:calendar id="endDate" value="#{bean.endDate}" mindate="#{bean.startDate}" disabled="#{empty bean.startDate}">
      <p:ajax event="dateSelect" update="startDate"/>
 </p:calendar>
Run Code Online (Sandbox Code Playgroud)

  • 只有在`<p:calendar>`组件中添加`readonlyInput ="true"`时才能正常工作. (3认同)