JSF не поддерживает проверку кросс-поля, есть ли обходной путь?

JSF 2.0 позволяет только проверять ввод в одном поле, например, проверять, является ли он определенной длиной. Это не позволяет вам иметь форму, которая гласит: «введите город и штат или введите только почтовый индекс».

Как вы обошли это? Меня интересуют только ответы, связанные с фазой проверки JSF. Я не заинтересован в установке логики проверки в Managed Beans.

2 Solutions collect form web for “JSF не поддерживает проверку кросс-поля, есть ли обходной путь?”

Самый простой пользовательский подход, который я видел и использовал до сих пор, – создать поле с помощью котором вы ссылаетесь на все задействованные компоненты как . Если вы объявите его перед компонентами, подлежащими проверке, вы можете получить представленные значения внутри валидатора UIInput#getSubmittedValue() .

Например

              

(обратите внимание на value="true" на скрытом входе, фактическое значение на самом деле не имеет значения, но имейте в виду, что валидатор не обязательно будет запущен, когда он пуст или пуст, в зависимости от версии и конфигурации JSF)

с

 @FacesValidator(value="fooValidator") public class FooValidator implements Validator { @Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { UIInput input1 = (UIInput) component.getAttributes().get("input1"); UIInput input2 = (UIInput) component.getAttributes().get("input2"); UIInput input3 = (UIInput) component.getAttributes().get("input3"); // ... Object value1 = input1.getSubmittedValue(); Object value2 = input2.getSubmittedValue(); Object value3 = input3.getSubmittedValue(); // ... } } 

Если вы объявите после подлежащих проверке компонентов, тогда значения задействованных компонентов уже будут преобразованы и проверены, и вы должны получить их по UIInput#getValue() или, возможно, UIInput#getLocalValue() (в в UIInput случае UIInput не isValid() ).

Смотрите также:

  • Валидатор для нескольких полей (целевой JSF 1.2)

В качестве альтернативы вы можете использовать для этого сторонние tags / компоненты. Например, RichFaces имеет для этого Seam3 имеет , а OmniFaces имеет несколько стандартных компонентов для этого, которые представлены здесь . OmniFaces использует компонентный подход, при котором задание выполняется в UIComponent#processValidators() . Он также позволяет настраивать его таким образом, чтобы вышеуказанное можно было выполнить, как показано ниже:

         

с

 @ManagedBean @RequestScoped public class FooValidator implements MultiFieldValidator { @Override public boolean validateValues(FacesContext context, List components, List values) { // ... } } 

Единственное отличие состоит в том, что он возвращает boolean и что сообщение должно быть указано как атрибут message в .

Apache ExtVal не упоминался здесь.

В нем есть несколько перекрестных подтверждений (среди других проверок, которые могут быть полезны):

https://cwiki.apache.org/confluence/display/EXTVAL/Property+Validation+Usage#PropertyValidationUsage-CrossValidation

  • Как заставить MVC проверять объект IValidatableObject
  • Целочисленная проверка для ввода
  • Использовать проверку ASP.NET MVC с помощью jquery ajax?
  • Использование DataAnnotations с платформой Entity Framework
  • Проверка Xml с использованием схемы XSD
  • Как установить флажок в форме ASP.NET?
  • Проверьте, нет ли входов пустых с помощью jQuery
  • Использование правил проверки WPF и отключение кнопки «Сохранить»
  • Angularjs препятствуют отправке формы при неудачной проверке ввода
  • Как заставить проверку формы html5 без отправки ее через jQuery
  • Как пропустить проверку при нажатии на определенную кнопку?
  • Interesting Posts

    Ресурс Java как файл

    Автозаполнение не работает в Outlook 2007

    Разрешение rsync запретило резервное копирование удаленного каталога на локальную машину

    Регулярное выражение для проверки пароля: «8 символов, включая 1 прописную букву, 1 специальный символ, буквенно-цифровые символы»

    Проверьте, имеет ли экземпляр тип

    RPM не удалит установленные каталоги, если они были изменены после первоначальной установки

    Как избежать запятой и двойной кавычки в то же время для CSV-файла?

    Доступ к клавишам dict, как атрибут?

    Есть ли такая вещь, как карта памяти WORM (запись-один раз-много) или USB-накопитель?

    .NET, событие каждую минуту (в минуту). Является ли таймер лучшим вариантом?

    Разбор комбинации обратного слэша и косой черты в имени файла

    Что является лучшей альтернативой Java Serialization?

    Как изменить цвет изображения в GIMP

    Отладка / выпуск Web.Config

    Не удалось установить Python в Windows 8

    Давайте будем гением компьютера.