Obsah
Enterprise aplikace většinou pracují s velkými objemy dat. Je samozřejmě žádoucí, aby
tato data byla za všech okolností validní a konzistentní. To je v JSF zajištěno
speciálními třídami, kterým se říká konvertory a
validátory. Vždy když uživatel potvrdí formulář,
JSF se během svého životního cyklu pokusí zadaná data zkonvertovat na požadovaný datový
typ a zvalidovat dle zadaných požadavků (pro více informací o zařazení konverze a
validace do životního cyklu JSF aplikace viz 7 – „Životní cyklus JSF aplikace“). Pokud se během
těchto procesů vyskytnou nějaké chyby, můžeme uživateli poskytnout příslušné informace
pomocí tagů message
či messages
(viz 4.3.6 – „Zprávy“).
V JSF naleznete sadu standardních konvertorů i validátorů, které využijete v
nejběžnějších případech. Všechny tyto třídy musí implementovat příslušné rozhraní -
javax.faces.convert.Converter
v případě konvertorů a
javax.faces.validator.Validator
v případě validátorů. Je také
možné, aby si programátor tato rozhraní implementoval sám a vytvořil si tak vlastní
třídy pro konverzi respektive validaci. Tvorba vlastních konvertorů a validátorů je však
mimo rozsah této práce (pro více informací o tvorbě vlastních konvertorů a validátorů
viz např. [3]). Ukážeme si proto pouze práci se základními
třídami přítomnými ve standardní JSF knihovně.
Na data, která jsou v aplikacích zpracovávána, existují dva pohledy. Jedním možným
pohledem jsou data uložena v beanech, která jsou
ukládána do různých datových typů, a druhým možným pohledem jsou data, která vidí
uživatel na monitoru, a jsou reprezentována textovými řetězci. Konvertory slouží
jako most mezi těmito dvěma pohledy [8]. Např. když v
beanech pracujeme s proměnnou typu
Date
, potřebujeme, aby se na stránce zobrazila informace
o datu, která je srozumitelná pro uživatele, což může být textový řetězec ve tvaru
DD.MM.YYYY nebo YYYY/MM/DD atp. Pokud naopak chceme, aby datum bylo zadáno
uživatelem, je třeba zajistit správné uložení textového řetězce do proměnné typu
Date
.
Není vždy nutné přiřazovat konvertor explicitně, neboť u některých kombinací UI
komponenty a přiřazeného datového typu je automaticky přiřazen vhodný konvertor.
Např. když komponentě inputText
přiřadíte proměnnou typu
Integer
, je automaticky přiřazen konvertor, který převádí
textový řetězec na celé číslo. Z toho důvodu jsme dosud v našich příkladech
konvertory nepotřebovali.
V knihovně JSF naleznete v balíčku javax.faces.convert
třináct standardních konvertorů, které jsem rozdělil do třech skupin:
BooleanConverter
,
ByteConverter
,
CharacterConverter
,
DoubleConverter
,
EnumConverter
,
FloatConverter
,
IntegerConverter
,
LongConverter
,
ShortConverter
- tyto jsou implicitně
přiřazovány k příslušným primitivním typům či jejich obalovým
třídám.
BigDecimalConverter
,
BigIntegerConverter
- tyto jsou implicitně
přiřazovány k typům BigInteger
respektive
BigDecimal
.
DateTimeConverter
,
NumberConverter
- toto jsou jediné
konvertory, které mají v core tag
library svůj tag a sice convertDateTime
a
convertNumber
. Tyto tagy si představíme později v této
kapitole.
Page author má čtyři možnosti, jak konvertor ke komponentě připojit [8]:
Spárovat komponentu s jedním z primitivních typů, či jeho obalovou třídou. Konvertor tak bude přiřazen automaticky.
V tomto příkladě by byl přiřazen konvertor podle typu proměnné
vek
beanu
uzivatel
. Pokud by např. tato proměnná byla typu
java.lang.Long
, byl by přiřazen konvertor
LongConverter
.
Druhou možností je využít atribut converter
. Hodnota
tohoto atributu musí být tzv. converter
id, což je konstanta, kterou mají všechny třídy
konvertorů. Id jednotlivých
konvertorů naleznete v [6].
Příklad 5.2. Přiřazení konvertoru pomocí atributu
converter
<h:inputText id="vek" value="#{uzivatel.vek}" converter="javax.faces.Long" converterMessage="Hodnota věku musí být číslo."/>
Třetí možnost je tag converter
z core tag library. Jeho atribut converterId
nastavíme na hodnotu id konvertoru,
který chceme použít.
Příklad 5.3. Přiřazení konvertoru pomocí tagu converter
<h:inputText id="vek" value="#{uzivatel.vek}"> <f:converter converterId="javax.faces.Byte"/> </h:inputText>
Pokud pracujeme s proměnnou číselného typu nebo data a času, můžeme
použít již zmíněný tag convertNumber
respektive
convertDateTime
. Výhodou těchto tagů je, že mají
několik atributů, pomocí kterých můžeme chování konvertoru konfigurovat.
U třech předchozích možností jsme mohli pouze přiřadit konvertor a
spokojit se se standardním chováním.
Příklad 5.4. Přiřazení konvertoru pomocí tagu
convertNumber
<h:inputText id="cena" label="Cena" value="#{objednavka.cena}"> <f:convertNumber minFractionDigits="0" maxFractionDigits="2"/> </h:inputText> <h:message for="cena" style="color:red"/><br/> <h:outputText value="#{objednavka.cena}"> <f:convertNumber type="currency" minFractionDigits="2"/> </h:outputText>
První textové pole přijímá číselnou hodnotu s maximálně dvěma
desetinnými místy. Druhý výstupní text tuto hodnotu vypisuje se dvěma
desetinnými místy ve formátu měny, tzn. např. 452,50 Kč. V příkladu vidíte také tag
message
, který, jak už jsem zmínil, zpravuje uživatele
o chybách, které při konverzi respektive validaci nastanou (viz 4.3.6 – „Zprávy“). Zde bych rád upozornil na atribut
converterMessage
, pomocí kterého můžete přepsat
standardní chybové hlášení svým vlastním. Tuto možnost jsme využili v
příkladu 5.2.
Pro více informací o tazích convertNumber
a
convertDateTime
a jejich atributech viz [10].