Вам нужен специальный валидатор даты, скажем, проверка этой даты с помощью rich: календарь не в прошлом. Таким образом, мы помещаем компонент календаря с валидатором внутри.
|
1
2
3
|
<rich:calendar value="#{fieldValue}" id="dateField" datePattern="yyyy/MM/dd"> <f:validator validatorId="dateNotInThePast"/> </rich:calendar> |
И наш валидатор может выглядеть так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@FacesValidator("dateNotInThePast")public class DateNotInThePastValidator implements Validator { @Override public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException { if (ObjectUtil.isNotEmpty(value)) { checkDate((Date)value, uiComponent, facesContext.getViewRoot().getLocale()); } } private void checkDate(Date date, UIComponent uiComponent, Locale locale) { if(isDateInRange(date) == false) { ResourceBundle rb = ResourceBundle.getBundle("messages", locale); String messageText = rb.getString("date.not.in.the.past"); throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, messageText, messageText)); } } private boolean isDateInRange(Date date) { Date today = new DateTime().withTime(0, 0, 0, 0).toDate(); return date.after(today) || date.equals(today); }} |
И если мы предоставим значение ключа в файле свойств, мы увидим что-то вроде этого:
Итак, похоже, что у нас есть рабочий и готовый к использованию пользовательский валидатор.
Эта проблема
Но в то время как наша форма становится все более сложной, мы можем столкнуться с проблемой, описанной на экране ниже:
Итак, проблема в том, как пользователь может определить, какая дата действительна, а какая нет? Наш валидатор использует один и тот же ключ свойства для отображения обоих сообщений об ошибках.
Решение
Нам нужно как-то предоставить метку проверенного поля нашему пользовательскому валидатору. И, что удивительно для JSF, это может быть достигнуто довольно легко. Единственный улов в том, что вы должны знать, как это сделать
Поэтому в Java Server Faces мы можем параметризовать компоненты с атрибутами (тег f: attribute ). Поэтому мы добавляем атрибут к rich: calendar, а затем читаем это переданное значение в валидаторе, назначенном этому календарному полю. Итак, теперь наши компоненты календаря должны выглядеть так:
|
1
2
3
4
|
<rich:calendar value="#{fieldValue}" id="dateField" datePattern="yyyy/MM/dd"> <f:validator validatorId="dateNotInThePast"/> <f:attribute name="fieldLabel" value="Date field 2" /> </rich:calendar> |
И в нашем Java-классе валидатора мы могли получить это значение, используя uiComponent.getAttributes (). Get (“fieldLabel”);
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
private void checkDate(Date date, UIComponent uiComponent, Locale locale) { if(isDateInRange(date) == false) { ResourceBundle rb = ResourceBundle.getBundle("messages", locale); String messageText = getFieldLabel(uiComponent) +" " + rb.getString(getErrorKey()); throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, messageText, messageText)); } } protected String getFieldLabel(UIComponent uiComponent) { String fieldLabel = (String) uiComponent.getAttributes().get("fieldLabel"); if(fieldLabel == null) { fieldLabel = "Date" ; } return fieldLabel; } |
Наше значение свойства error должно иметь значение, которое не может быть в прошлом, так как в начале сообщения об ошибке будет добавлена метка даты или поля.
И рабочий пример должен показать что-то похожее на этот экран:
Ссылка: Параметризация пользовательского валидатора в JSF 2 от нашего партнера по JCG Томаша Дзюрко в блоге Code Hard Go Pro
Статьи по Теме :


