2013-02-20 74 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