2010-05-24 3 views
3

Если у меня есть много элементов управления вводами в форме (для каждого из этих элементов управления ввода есть отдельные валидаторы - как требуется, длина и т. Д.), Есть командная кнопка, которая отправляет форму и вызывает метод действия. Требование - хотя значения контроля ввода, скажем, индивидуально - комбинация этих значений должна быть в порядке, чтобы обрабатывать их вместе после отправки формы. Где я могу разместить код для их проверки?Лучший подход к проверке формы jsf

1) Могу ли я добавить пользовательский валидатор для командной кнопки и проверить комбинацию вместе? например, validate(FacesContext arg0, UIComponent arg1, Object value), но даже тогда у меня не будет значений других элементов управления вводом, за исключением того, что значение кнопки/компонента команды справа?

2) Могу ли я выполнить проверку комбинации в методе действий и добавить сообщения проверки, используя FacesMessage?

или вы предлагаете какой-либо другой подход?

Спасибо за ваше время.

ответ

4

точка 2 уже ответил на Bozho. Просто используйте FacesContext#addMessage(). A ID null ID клиента позволит ему посадку в <h:messages globalOnly="true">. Фиксированный идентификатор клиента, такой как formId:inputId, позволит ему приземлиться в <h:message for="inputId">.

Пункт 1 выполнимо, вы можете получить другие компоненты внутри метода валидатора с помощью UIViewRoot#findComponent():

UIInput otherInput = (UIInput) context.getViewRoot().findComponent("formId:otherInputId"); 
String value = (String) otherInput.getValue(); 

Вы, однако, должны разместить f:validator в последнейUIInput компонента. Размещение его в компоненте UICommand (например, кнопка) не будет работать.

Правда, жестко кодирование идентификаторов клиентов является неприятным, но это выигрыш от битого негибкого механизма проверки в JSF.

+0

Как остановить выполнение после добавления сообщений в соответствии со вторым подходом? – gekrish

+0

Вернитесь на ту же страницу. – BalusC

3

Я успешно использовал 2-й подход:

FacesMessage facesMessage = 
     new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg); 
FacesContext.getCurrentInstance().addMessage(null, facesMessage); 
+0

Спасибо Божо. Я предпочел бы использовать второй подход. – gekrish

4

Я только что приземлился на ваш пост после того же вопроса.

Статьи Я прочитал до сих пор определить, что существует четыре типа проверки для следующих целей:

  1. Встроенные в компоненты (подписаться на отдельные поля, требуется = истина, LengthValidator и т.д.)
  2. «Проверка приложения» добавлена ​​к действию в компоненте «Бэк» (бизнес-логика)
  3. Пользовательские валидаторы (подписка на отдельные поля)
  4. Метод в бэк-компоненте, используемом в качестве пользовательского валидатора (подписка на отдельные поля).

Что касается валидаторов: механизм проверки подлинности в JSF был разработан для проверки одного компонента.(See S/O Question here)

В том случае, когда вы хотите проверить на всю форму как логическую группировку полей, оказывается стандартным JSF/Apache MyFaces, что наиболее целесообразным сделать это, как Application Validation, как совокупность индивидуальных поля берут на себя коллективное деловое значение на данном этапе.

BalusC придумал способ shoehorning формы проверки в один валидатор, прикрепленного к последней форме пункта (опять же, см S/O Вопрос here, а другой работал пример на своем сайте here), однако это не обязательно расширяемый/reusable, так как ссылки на идентификаторы формы должны быть жестко запрограммированы, поскольку вы не можете добавить подпись подписи validate(). Если вы используете форму только один раз, вам это удастся, но если она появится несколько раз или если вы программно создаете свой идентификатор, вы застряли.

Элемент реализации JSF Seam имеет элемент управления <s:validateForm />, который может принимать идентификаторы полей в другом месте вашей формы в качестве параметров. К сожалению, похоже, что ни одна из реализаций JSF MyFaces/Mojara/Sun не имеет эквивалента, поскольку она не является частью стандарта.

+0

+1 оцените свои усилия и рекомендации ... – dakait

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