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