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

ответ

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

Прошу проставить код неполного для случая 'year', я этого не заметил. Спасибо за ваше решение, оно решает мою проблему. Благодаря! –

+0

Добро пожаловать – Daniel

Смежные вопросы