2013-02-20 72 views
0

我想用自定义验证器创建选定的生日。 这是我的看法:JSF:如何创建自定义验证器到出生日期?

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

但由于某些原因,我在我的验证和month对象year始终为空。 说实话我不知道如何将selectItems中的选定值链接到我的validator.

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

+1

相关:http://balusc.blogspot.com/2013/01/composite-component-with-multiple-input.html – BalusC 2013-02-20 12:02:02

回答

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() 
+0

抱歉发布的代码不完整的情况下'年',我没有注意到这一点。感谢您的解决方案,它解决了我的问题。谢谢! – 2013-02-20 10:49:40

+0

不客气 – Daniel 2013-02-20 11:30:41