Одной из наиболее частых потребностей при разработке форм приложения является проверка нескольких полей (или перекрестная проверка, но я не использую этот термин, потому что когда я помещал его в 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 .