Generalnie istneje kilka sposobów walidacji. Pierwszy z nich widzieliśmy w pierwszym przykładzie
- była to walidacja wewnątrz bean'a. Jest to zdecydowanie najbardziej czasochłonna metoda.
Dużo łatwiej posłużyć się gotowymi walidatorami.
Po pierwsze niejawną metodą jest ustawiane typów atrybutów bean'ów wczytywanych z formularza. Np. jeżeli
atrybut jest typu int
, a w jego pole formularza wpiszemy litery, to wysłanie formularza nie powiedzie się,
a z naszym polem tekstowym związany zostanie błąd, który będziemy mogli wypisać.
W standartdowej bibliotece istnieją też walidatory które możemy wywoływać jawnie:
<h:inputText value="#{bidBean.userID}"
required="true"
id="userID">
<f:validateLength minimum="5" maximum="6"/>
</h:inputText>
Po pierwsze, za pomocą atrybutu required="true"
sprawiamy że pole będzie wymagane. Natomiast
komponent <f:validateLength>
sprawdza czy długość wprowadzonej wartości pola jest w wyznaczonym przez nas przedziale.
Atrybut id
jest użyty w celu stworzenia możliwości dostępu do błędu związanego z tym polem. Błąd możemy
wyświetlić następująco:
<h:message for="userID" styleClass="RED"/>
gdzie atrubut for
określa id obiektu, którego komunikaty chcemy wypisać.
Inny przykład:
<h:inputText value="#{bidBean.bidAmount}"
id="amount">
<f:validateDoubleRange minimum="0.10"/>
<f:convertNumber maxFractionDigits="2"/>
</h:inputText>
Tutaj oprócz walidacji wielkości liczby, używamy konwertera (jest on też przy okazji walidatorem). Nasz
konwerter zaokrągla nasz ułamek do dwóch miejsc po przecinku - do bean'a idzie już skonwertowana wartość.
Niestety zestaw walidatorów z biblioteki standardowej jest dość ubogi, więc dla podniesienia możliwości skorzystamy z dodatkowej biblioteki dostępnej z implementacją MyFaces. Dodatkową bibliotekę tagów deklarujemy obok standardowych:
<%@ taglib uri="http://myfaces.apache.org/extensions"
prefix="x"%>
Teraz już możemy korzystać z innych walidatorów takich jak:
<x:validateEmail/>
czy <x:validateCreditCard/>
czy walidatora sprawdzającego zgodność z wyrażeniami regularnymi.
Tak jak w przypadku innych komponentów, możemy stworzyć też własne walidatory. Nasz walidator
musi implementować interfejs Validator
(z metodą validate
) i rzucać odpowiednie wyjątki. Po zadeklarowaniu
go w pliku faces-config.xml możemy go używać.
Ostatnią sprawą o której trzeba tu wspomnieć są komunikaty błędów. Oczywiście musi istnieć możliwość ich przedefiniowywania (chociażby ze względu na aplikacje, które nie są w języku angielskim). Możemy to zrobić we wspomnianych plikach .properties - każdy komunikat błędu ma swoją etykietę, np. javax.faces.component.UIInput.REQUIRED odnosi się do komunikatu o braku wymaganego pola. Wystarczy wpisać do naszego pliku:
javax.faces.component.UIInput.REQUIRED=Brak wymaganego pola
aby zamienić komunikat.