【问题标题】:Compare two fields that use same class比较使用同一类的两个字段
【发布时间】:2012-02-03 11:13:56
【问题描述】:

我有两个输入字段 fromDate 和 toDate ,它们是 Date 类的实例。 Date 类使用自定义日期验证器来验证月、日和年字段 包含在日期字段中。 自定义日期验证器特定于每个日期,即 fromDate 和 toDate。 我需要将 fromDate 的月、日或年字段与 toDate 进行比较。 如果 fromDate 大于 toDate,则必须显示验证消息。

更新:

fromDate 和 toDate 是两个自定义日期组件,如下所示

<eg:dateField id="inpFromDate" value="#{mrBean.fromDate}" .... />
<eg:dateField id="inpToDate" value="#{mrBean.toDate}" .... />

fromDate 和 toDate 是 Date 类的实例

public class Date {
private String mm;
private String dd;
@customDateValidator   //Validates each date field
private String yyyy;
//constructors
//getters and setters

在每个日期都已经有验证器的情况下,您将如何实现验证器

【问题讨论】:

    标签: validation jsf jsf-2


    【解决方案1】:

    是的,你可以!假设您有以下 PrimeFaces 的输入字段:

    <p:calendar id="from" value="#{mrBean.fromDate}" binding="#{from}" >
       <p:ajax process="from to" update="toDateMsg" />
    </p:calendar>
    <p:calendar id="to"   value="#{mrBean.toDate}" >
       <f:attribute name="fromDate" value="#{from.value}" />
       <f:validator validatorId="validator.dateRangeValidator" />
       <p:ajax process="from to" update="toDateMsg" />
    </p:calendar>
    <p:message for="to" id="toDateMsg" />
    

    这应该是你的Validator:

    @FacesValidator("validator.dateRangeValidator")
    public class DateRangeValidator implements Validator {
    
        @Override
        public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
            if (value == null || component.getAttributes().get("fromDate") == null) return;
    
            Date toDate   = (Date) value; 
            Date fromDate = (Date) component.getAttributes().get("fromDate");
    
            if (toDate.after(fromDate)) {
                FacesMessage message = new FacesMessage("Invalid dates submitted.");
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);
            }
        }
    }
    

    请注意,我使用 PrimeFaces 的 &lt;p:calendar&gt; 组件来编写我的示例,因为绑定到该组件的属性在被验证之前会自动转换为 Date 对象。在您的程序中,您可能有自己的ConverterString 转换为Date

    【讨论】:

    • 如果在设置结束日期后将开始日期更改为错误日期怎么办?
    • 当您使用普通的&lt;h:inputText&gt;&lt;f:convertDateTime&gt;&lt;f:ajax&gt; 时,对 OP 会更有帮助,但重点很明确。验证器类名称也可以比“DateValidator”更具自我描述性,顺便说一句。也许是“DateRangeValidator”?
    • @BalusC 我已经用Validator 的新名称更新了我的答案。起初,我确实使用&lt;h:inputText&gt; 编写了我的示例。但是,我对&lt;f:convertDateTime&gt; 不是很熟悉,因为我一直在使用&lt;p:calendar&gt;。这就是为什么我最终使用 PrimeFaces 写作并在末尾添加注释:P。
    • @user1072193: 嗯...我认为您可以将 2 个验证器合并为 1 个验证器,仅用于 toDate
    • @Mr.J4mes:您的意思是删除@customDateValidator?
    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2019-08-27
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多