Kapitola 5. Konverze a validace

Obsah

5.1. Konvertory
5.1.1. Použití konvertorů na stránce
5.2. Validátory
5.2.1. Použití validátorů na stránce
5.3. Příklad k procvičení

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ě.

5.1. Konvertory

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.

5.1.1. Použití konvertorů na stránce

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]:

  1. Spárovat komponentu s jedním z primitivních typů, či jeho obalovou třídou. Konvertor tak bude přiřazen automaticky.

    Příklad 5.1. Automatické přiřazení konvertoru

    <h:inputText id="vek" value="#{uzivatel.vek}"/>

    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.

  2. 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."/>

  3. 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>

  4. 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].

Creative Commons License
Uvedená práce (dílo), jejímž autorem je Bc. David Hanel, podléhá licenci Creative Commons Uveďte autora-Neužívejte dílo komerčně-Zachovejte licenci 3.0 Česko.