JavaServer Faces

Walidacja
Standardowe komponenty walidacyjne
Podobnie jak w przypadku konwersji, JSF zapewnia zachowanie spójności modelu przez użycie wartości lokalnych.

Walidacja danych odbywa się przez zagnieżdżenie odpowiedniego taga jsf/core w tagu definiującym pole podlegające walidacji:

<h:inputText value="#{user.login}" id="log">
<f:validateLength minimum="3" />
</h:inputText>


Jak widać pole bedzie walidowane względem długości wpisanych danych. Szczegółowy opis możliwych standardowych walidacji dostępny jest na stronie JSF.

Brak wsparcia standardowych komponentów dla walidacji po stronie klienta
Standardowe tagi walidacyjne zawsze wykonują żądanie HTTP, nie ma wsparcia dla walidacji po stronie klienta. Aby to osiągnąc trzeba napisać własny komponent walidacyjny, wykorzystujący JavaScript.

Specyficzna walidacja: required
Walidacja polegająca na wymaganiu wypełnienia pola jest obsługiwana w sposób uproszczony - wystarczy podać atrybut required="true" wspierany przez wszystkie standardowe komponenty:

<h:inputText value="#{question.answer}" required="true" id="yesno"/>

Komunikaty o błędach
W przypadku niepowodzenia walidacji wyświetlana jest ponownie ta sama strona, bez zmian w modelu. Jeżeli dla pola podlegającego walidacji zdefiniowano atrybut id to istnieje możliwość wyświetlenia komunikatu o błędzie:

<h:message for="log" />


Zmiana standardowych komunikatów
Domyślnie w przypadku błędu walidacji wyświetlany jest standardowy komunikat w języku angielskim, specyficzny dla danego typu walidacji. Domyślny komunikat można zmienić ustawiając w message.properties:

javax.faces.component.UIInput.REQUIRED=Pole jest wymagane
javax.faces.validator.LengthValidator.MINIMUM=Wpisana warto\u015b\u0107 powinna by\u0107 d\u0142ugo\u015bci co najmniej {0}


Umieszczenie komunikatów w plikach dla odpowiednich wersji językowych spowoduje wyświetlenie informacji w języku zgodnym z bieżącym locale.

Tworzenie własnego walidatora: komponent walidacyjny, metoda Managed Bean'a
Przy tworzeniu aplikacji może się okazać konieczne przeprowadzenie walidacji innej niż obsługiwanej przez standardowe komponenty. W tym celu należy utworzyć klasę implementującą interfejs Validator i zaimplementować metodę void validate(...), w której wykonywana jest walidacja. W przypadku kiedy walidacja się nie powiodła, należy rzucić wyjątek ValidatorException. Użyć konwertera można używając komponentu f:validator. Walidator należy również zdefiniować w pliku faces-config.xml.

Drugim sposobem przeprowadzenia walidacji jest bezpośrednie wywołanie metody z Managed Bean'a:

<h:inputText value="#{user.login}" required="true" validator="#{user.checkLogin}"/>

Metoda walidująca musi mieć taką samą sygnaturę jak metoda validate z interfejsu Validator.
Zaletą drugiego sposobu jest dostęp do pozostałych pól klasy, w której wykonuje się walidacja. Wadą jest trudność w ponownym użyciu metody np. w innej aplikacji.

JavaServer Faces