【问题标题】:JSF : How create custom validator to birthdate?JSF:如何为生日创建自定义验证器?
【发布时间】:2013-02-04 23:28:42
【问题描述】:

我想使用自定义验证器创建选定的生日。 这是我的看法:

        <h:selectOneMenu id="birthdate_day" value="#{userc.userb.b_day}">
            <f:validator validatorId="dateExistValidator" />
            <f:attribute name="day" value="#{dateExist.submittedValue}" />
            <f:ajax event="blur" render="m_birthdate_day" />

            <f:selectItem itemLabel="Dia" itemValue="" />
            <f:selectItems value="#{userc.birthDateDays}" />
        </h:selectOneMenu>
        <h:selectOneMenu id="birthdate_month" value="#{userc.userb.b_month}" binding="#{dateExist}" >
            <f:selectItem itemLabel="Mês" itemValue="" />
            <f:selectItems value="#{userc.birthDateMonths}" var="month" itemValue="#{month.key}" itemLabel="#{month.value}" />
            <f:ajax event="blur" execute="birthdate_day birthdate_month" render="m_birthdate_month" />
        </h:selectOneMenu>
        <h:selectOneMenu id="birthdate_year" value="#{userc.userb.b_year}">
            <f:selectItem itemLabel="Ano" itemValue="" />
            <f:selectItems value="#{userc.birthDateYears}" />
            <f:ajax event="blur" render="m_birthdate_year" />
        </h:selectOneMenu>

这是我的验证器:

@FacesValidator("dateExistValidator")
public class DateValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        Integer day =   (Integer) value;
        Integer month = (Integer) component.getAttributes().get("month");
        Integer year =  (Integer) component.getAttributes().get("year");

        if (day == null || month == null || year == null) {
            return; // Just ignore and let required="true" do its job.
        }

        // do the verifications if the selected date exist
    }
}

但由于某种原因,我的验证器中的monthyear 对象始终为空。 老实说,我不知道如何将selectItems 中的选定值链接到我的validator.

我该怎么做?或者我应该仅在用户提交表单时进行此验证?

【问题讨论】:

标签: jsf date jsf-2 validation


【解决方案1】:

你发布的代码不完整吗?

这应该可以工作

    <h:selectOneMenu id="birthdate_day" value="#{userc.userb.b_day}">
        <f:validator validatorId="dateExistValidator" />

        <f:attribute name="month" value="#{myMonth}" />
        <f:attribute name="year" value="#{myYear}" />
        <f:ajax event="blur" render="m_birthdate_day" />

        <f:selectItem itemLabel="Dia" itemValue="" />
        <f:selectItems value="#{userc.birthDateDays}" />
    </h:selectOneMenu>
    <h:selectOneMenu id="birthdate_month" value="#{userc.userb.b_month}" binding="#{myMonth}" >
        <f:selectItem itemLabel="M?s" itemValue="" />
        <f:selectItems value="#{userc.birthDateMonths}" var="month" itemValue="#{month.key}" itemLabel="#{month.value}" />
        <f:ajax event="blur" execute="birthdate_day birthdate_month" render="m_birthdate_month" />
    </h:selectOneMenu>
    <h:selectOneMenu id="birthdate_year" value="#{userc.userb.b_year}" binding="#{myYear}">
        <f:selectItem itemLabel="Ano" itemValue="" />
        <f:selectItems value="#{userc.birthDateYears}" />
        <f:ajax event="blur" render="m_birthdate_year" />
    </h:selectOneMenu>

另外,要从属性中获取值,您应该首先将它们转换为它们的 UIElement,然后提取它们的值,例如

UISelectOne month = (UISelectOne) component.getAttributes().get("myMonth");
month.getSubmittedValue()

【讨论】:

  • 抱歉,year 的代码不完整,我没有注意到。感谢您的解决方案,它解决了我的问题。谢谢!
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2017-04-04
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
相关资源
最近更新 更多