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