Walidacja

Teraz przyjrzymy się bliżej zagadnienu walidacji danych. W tym celu zapoznamy się z kolejnym przykładem dostępnym pod http://localhost:8080/JSFtest/validate.faces Udostępnia on formularz który musimy wypełnić, wprowadzone wartości są sprawdzane walidatorami, a informacje o błędach wypisywane.

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.