Статьи

Упрощенная проверка нескольких полей с помощью JSF 2.0

Одной из наиболее частых потребностей при разработке форм приложения является проверка нескольких полей (или перекрестная проверка, но я не использую этот термин, потому что когда я помещал его в Google, у меня действительно были некоторые послевоенные фотографии). Я говорю о ситуациях, когда нам нужно сравнить, является ли начальная дата более ранней, чем конечная, или значение ниже, чем другая. Разве это не очевидная особенность в каждой бизнес-ориентированной среде? На самом деле, нет.
К сожалению, спецификация JSF не поддерживает ее по умолчанию. Таким образом, до своего последнего производственного выпуска ( JSR 245 — JSF 2.1) JSF не предлагал встроенную функцию проверки нескольких полей.

Мы, вероятно, можем надеяться на то, что что-то появится в JSF 2.2, поскольку в JSR 344 упоминается «проверка нескольких полей». Между тем, разработчики использовали свое плодотворное творчество для реализации своих решений. Вы можете найти множество рабочих альтернатив на Stackoverflow.com ; люди создают свои собственные компоненты ; фреймворки, построенные на основе Java EE, пытающиеся охватить эту функцию; и много других случаев.

Мне не понравилось решение, которое я нашел. Некоторые из них сложные, другие не такие элегантные. Поэтому я решил проявить креативность и попробовать более простое решение, которое легко понять и изменить, когда придет время для рефакторинга. Это не значит, что я предлагаю что-то лучше, чем другие предложения. Я просто предлагаю что-то попроще.

В следующем примере я проверяю, меньше ли выделенный бюджет, чем лимит бюджета. Если нет, то сообщение показывается пользователю. В примере рассматриваются только два поля, но он может масштабироваться до любого количества полей.

Шаг 1: создайте атрибут в управляемом компоненте для каждого проверяемого поля:

Приведенные ниже атрибуты используются исключительно в проверке нескольких полей.

1
2
private BigDecimal allocatedBudget;
private BigDecimal budgetLimit;

В этом примере я пишу код внутри класса с именем MBean, аннотированного @ManagedBean и @RequestScoped.

Шаг 2: создайте метод проверки в одном и том же управляемом компоненте для каждого поля

Это решение рассматривает методы проверки, реализованные в управляемом компоненте, вместо реализаций интерфейса javax.faces.validator.Validator . Вы можете дать любое имя методам проверки, если определите три стандартных параметра: FacesContext, UIComponent и Object, представляющий значение, введенное в поле. Только значение полезно для нашей проверки. Смотрите методы проверки:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public void validateAllocatedBudget(FacesContext context,
                       UIComponent component, Object value) {
   this.validationAllocatedBudget = (BigDecimal) value;
}
 
public void validateBudgetLimit(FacesContext context,
                        UIComponent component, Object value) {
   this.validationBudgetLimit = (BigDecimal) value;
   if(this.validationBudgetLimit
          .compareTo(this.validationAllocatedBudget) < 0) {
       throw new ValidatorException(
                 new FacesMessage("Invalid allocated budget!");
   }
}

Метод validateAllocatedBudget не проверяет выделенный бюджет. Он просто устанавливает атрибут validationAllocatedBudget, чтобы впоследствии можно было использовать его значение. Это возможно потому, что методы проверки вызываются в той же последовательности, в которой они объявлены в коде JSF. Таким образом, вы можете создать простой метод, подобный этому, для каждого поля, участвующего в проверке. Эффективная проверка происходит в методе validateBudgetLimit, который является последним вызванным методом проверки в файле JSF и, таким образом, последним из выполняемых.

Рекомендуется объявлять атрибуты и методы проверки в одном и том же порядке полей в форме. Порядок не мешает работе алгоритма, но помогает понять логику. С другой стороны, важен порядок вызовов в файле JSF.

Шаг 3: используйте валидатор параметра для ссылки на метод валидации

Методы, описанные выше, вызываются из полей ниже. Помните, что атрибуты и методы были реализованы в классе MBean.

1
2
3
4
5
6
7
8
9
<h:outputLabel for="allocBudget" value="Allocated Budget"/>
<h:inputText id="allocBudget" label="Allocated Budget"
    value="#{mBean.operation.allocatedBudget}"
    validator="#{mBean.validateAllocatedBudget}"/>
 
<h:outputLabel for="budgetLimit" value="Budget Limit"/>
<h:inputText id="budgetLimit" label="Budget Limit"
    value="#{mBean.operation.budgetLimit}"
    validator="#{mBean.validateBudgetLimit}"/>

Ссылка: упрощенная проверка нескольких полей с помощью JSF 2.0 от нашего партнера по JCG Хильдеберто Мендонки в блоге Hildeberto’s Blog .