JavaServer Faces

Konwersja
Konwersja stringa przekazanego w żądaniu HTTP na bardziej specyficzny typ danych - liczba, data itd.
Standardowo o wartościach pól przekazywanych w formularzu nie można powiedzieć wiele więcej niż to, że są to łancuchy znaków. Framework JSF proponuje mechanizm konwersji, umożliwiający deklaratywną konwersję otrzymywanego łańcucha do oczekiwanego typu danych. Dba przy tej okazji o spójność i obsługę błędów.

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

<h:inputText id="date" value="#{date.curdate}">
<f:convertDateTime pattern="yyyy-MM-dd"/>
</h:inputText>


W tym wypadku nastąpi konwersja do typu Date. Szczegółowy opis możliwych standardowych konwersji dostępny jest na stronie JSF.

Wartości lokalne do utrzymania spójności Managed Bean'a
Bean w którym zostaną umieszczone dane po wysłaniu formularza może przed wysłaniem posiadać już pewien stan (np. ma zasięg sesji). W sytuacji, w której aktualizowany jest model i wartość któregoś pola ma zostać skonwertowana do zadanego typu danych istnieje możliwość, że konwersja się nie powiedzie. W tej sytuacji stan modelu powinien zostać przywrócony do stanu poprzedniego, w tym celu JSF trzyma zmieniane atrybuty modelu jako wartości lokalne i dopiero kiedy cała aktualizacja modelu się powiedzie, wartości lokalne sa ustawiane w docelowym modelu i nie ma miejsca rozspójnienie modelu.

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

<h:message for="date" />


Zmiana standardowego komunikatu
Domyślnie w przypadku błędu konwersji wyświetlany jest standardowy komunikat w języku angielskim. Domyślny komunikat można zmienić ustawiając w message.properties:

javax.faces.component.UIInput.CONVERSION=Popraw pole

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

Tworzenie własnego konwertera: komponent konwertujący
Przy tworzeniu aplikacji może się okazać konieczne przeprowadzenie konwersji do innego typu danych niż obsługiwane przez standardowe komponenty. W tym celu należy utworzyć klasę implementującą interfejs Converter i zaimplementować metody Object getAsObject(...) i String getAsString(...), w których wykonywana jest konwersja. W przypadku kiedy wykonanie konwersji nie jest możliwe, należy rzucić wyjątek ConversionException. Użyć konwertera można podając pełną nazwę klasy (razem z pakietem) w atrybucie conversion odpowiedniego komponentu, lub używając komponentu f:converter. Konwerter należy również zdefiniować w pliku faces-config.xml.

JavaServer Faces