4.3. Použití UI komponent na stránce

Nyní si jednotlivé UI komponenty roztřídíme do několika skupin, které si postupně představíme. Opakuji, že zde nebudu komponenty popisovat dopodrobna. Bude se jednat pouze o stručný přehled a některé komponenty, které pokládám za méně důležité, budou zcela opomenuty. Proto využívejte i [10].

4.3.1. Základní atributy tagů

Jako první si představíme základní atributy JSF tagů [8]. Tyto atributy jsou pro většinu z nich společné.

  • id - jedinečný identifikátor komponenty.

  • rendered - udává podmínku, která musí být splněna, aby se komponenta na stránce zobrazila.

  • style - definuje kaskádový styl pro komponentu.

  • styleClass - definuje třídu, do které je komponenta zařazena v rámci kaskádových stylů.

  • value - připojuje ke komponentě datovou hodnotu.

  • immediate - může být použit buď u UICommand nebo u UIInput komponent a ovlivňuje životní cyklus aplikace. Tímto atributem se budeme zabývat až v sekci 7.7.1 – „Ovlivňování životního cyklu pomocí atributu immediate.

Všechny tyto atributy kromě id přijímají výrazy jazyka EL. Existuje samozřejmě mnoho dalších atributů specifických pro konkrétní komponenty. O těch důležitých se případně zmíním v sekcích, které se danou komponentou zabývají.

K JSF tagům můžeme přidávat také některé atributy z HTML, např. alt, border, size atd. Pokud chceme na stránku umístit klientský skript, můžeme využít také atributy událostí z DHTML, např. onclick, onmousedown, onfocus atd. Tyto atributy jsou pak z JSF tagů do HTML podoby převedeny beze změny. Tak např. JSF tag <h:inputText value="#{user.name}" size="5" onfocus="nazevFunkce()"/> vygeneruje <input type="text" size="5" onfocus="nazevfunkce()"/> [3].

4.3.2. Formuláře

Formuláře představují ve webových aplikacích jeden z nejdůležitějších prvků. Slouží obecně ke komunikaci s uživatelem. S tagem formuláře jsme se již setkali v naší první JSF aplikaci. Pro připomenutí se můžete podívat na příklad 3.4. Jak vypadá jednoduchý formulář na stránce, můžete vidět na obrázku 3.5.

Hlavním rozdílem oproti HTML tagu formuláře je, že formulář v JSF nemá atribut method ani action. V JSF se totiž vždy používá metoda POST a všechny formuláře jsou směrovány na stejnou stránku, odkud byly odeslány. Přechod na požadovanou stránku je proveden až následně na základě pravidel pro navigaci, které jsou definovány v souboru faces-config.xml (navigaci mezi stránkami jsem vysvětlil v sekci 3.3.2.4 – „Definování pravidel pro navigaci mezi stránkami“).

Z důležitých atributů specifických pro formulář bych rád zmínil atribut prependId. Pokud je tato hodnota nastavena na true (defaultní hodnota), je id formuláře automaticky zahrnuto do id každého z jeho prvků. Tak např. formulář má id loginForm a obsahuje dvě textová pole, která mají id jmeno a heslo. Při hodnotě prependId="true" budou názvy formulářových polí v HTML kódu loginForm:jmeno a loginForm:heslo. Pokud nastavíte prependId="false", id formulářových polí si zachovají své původní názvy. Toto je třeba vzít v úvahu, pokud chcete na stránce použít klientský skript, ve kterém se odkazujete na formulářová pole. Musíte si být vědomi, jak jsou jednotlivá pole v konečném HTML kódu pojmenována.

4.3.3. Textové prvky

Textové prvky je možné rozdělit na vstupní a výstupní. Mezi vstupní prvky můžeme zařadit:

inputText

Tento tag představuje obyčejné textové pole, se kterým jsme se už také setkali v naší první aplikaci (viz příklad 3.5 nebo obrázek 3.5). Z atributů zde můžeme zmínit readonly, který když nastavíme na true, hodnota pole nepůjde změnit. Atribut value zde přijímá buďto řetězec, nebo EL výraz odkazující na proměnnou backing beanu.

inputSecret

Podobný tag jako inputText, s tím rozdílem, že se nezobrazuje text, nýbrž hvězdičky. Používá se samozřejmě na hesla. Užitečný je atribut redisplay, který udává, zda si má komponenta udržovat svou hodnotu mezi požadavky či ne.

Příklad 4.1. Tag inputSecret

<tr>
    <td>Heslo:</td>
    <td><h:inputSecret id="heslo" value="#{user.heslo}" redisplay="false"/></td>
</tr>

inputTextarea

Tento tag představuje vstupní pole pro delší víceřádkový text. Užitečné atributy jsou cols a rows, které udávají výšku a šířku pole. Jinak funguje taky stejně jako inputText.

Příklad 4.2. Tag inputTextarea

<tr>
    <td>Vlastnosti:</td>
    <td><h:inputTextarea id="vlastnosti" value="#{user.vlastnosti}" cols="15" rows="6"/></td>
</tr>

U těchto tagů se také často využívá atribut required, který udává, zda je nutné pole vyplňovat (přijímá hodnoty true a false). Atribut requiredMessage, pak udává zprávu, která se zobrazí v případě, že uživatel povinné pole nevyplnil. Tento atribut je přístupný také u některých dalších tagů, např. u některých selekcí (viz 4.3.5 – „Selekce“). Dále je možno nastavit těmto komponentám validátor či konvertor pomocí atributů validator a converter (pro více informací o konverzi a validaci viz 5 – „Konverze a validace).

Mezi výstupní textové prvky můžeme zařadit:

outputText

Tento tag představuje nejjednodušší výstupní text. V základním tvaru generuje na HTML stránku čistý text, bez jakéhokoliv tagu. Pokud použijeme atribut style, vygeneruje se HTML tag span. Opět se můžete podívat na již zmíněný příklad 3.5.

outputFormat

Tag outputFormat umí vypsat text s parametry deklarovanými uvnitř svého těla pomocí tagů param z knihovny core tag library.

Příklad 4.3. Tag outputFormat

<h:outputFormat value="{0} má rád {1}.">
    <f:param value="Jirka"/>
    <f:param value="fotbal"/>
</h:outputFormat>

Uvedený příklad bude mít za následek vypsání textu "Jirka má rád fotbal".

U obou těchto tagů je poměrně důležitý atribut escape. Pokud je nastaven na true, automaticky se mění všechny znaky <, > a & na příslušné entity. Můžeme tak zabránit útokům typu cross-site scripting.

4.3.4. Tlačítka a odkazy

Tlačítka a odkazy jsou další elementy, které naleznete snad v každé webové aplikaci. Slouží samozřejmě pro navigaci mezi stránkami a také pro potvrzování formulářů.

V JSF existují pro tlačítka respektive odkazy tři elementy - commandButton a commandLink, za kterými stojí třída UICommand, a outputLink, za kterým stojí třída UIOutput. Mezi command tagy a output tagem je samozřejmě zásadní rozdíl. Tagy commandButton a commandLink vyvolávají akci a spouští cyklus JSF aplikace (pro více informací o životním cyklu JSF aplikace viz 7 – „Životní cyklus JSF aplikace). O tom, na jakou následující stránku se bude aplikace ubírat, zde rozhoduje atribut action a pravidla definována v souboru faces-config.xml. Naproti tomu tag outputLink nijak cyklus JSF aplikace neovlivňuje a slouží jako prostý odkaz na zdroj uvedený v atributu value.

commandButton

S tímto tagem jsme se také již setkali v naší první JSF aplikaci (viz příklad 3.5). Generuje klasické tlačítko pro potvrzení formulářových dat.[31]

commandLink

Tento tag funguje téměř stejně jako commandButton. Aby však mohl odkaz vyvolávat akce stejně jako tlačítko, je na HTML výstup generován klientský skript, který tuto možnost zajišťuje. Aktivní prvky, které slouží jako odkaz, musíme umístit do těla tagu. V následujícím příkladu může uživatel kliknout jak na text, tak i na obrázek. V obou případech se odkaz aktivuje.

Příklad 4.4. Tag commandLink

<h:commandLink action="registrace">
    <h:outputText value="Registrovat"/>
    <h:graphicImage value="/registrace.jpg"/>
</h:commandLink>

Oba výše uvedené tagy přijímají dva důležité atributy - action a actionListener. Atribut action udává logický výstup v podobě textového řetězce, podle něhož se aplikace rozhoduje, na jakou stránku po aktivaci komponenty pokračovat. Můžeme uvést buďto přímo textový řetězec, nebo odkaz na metodu backing beanu, která na základě nějakého rozhodovacího procesu textový řetězec vrací (viz příklad 3.7). V atributu actionListener voláme metodu backing beanu, která obslouží akci vyvolanou při aktivaci komponenty (pro více informací o zpracování událostí viz 6 – „Zpracování událostí).

outputLink

Jak jsme již zmínili, jedná se o obyčejný odkaz, který nijak neovlivňuje JSF aplikaci. Atribut value zde slouží pro zadání URL, na kterou odkaz povede. Stejně jako u tagu commandLink umisťujeme aktivní prvky do těla tagu.

Příklad 4.5. Tag outputLink

<h:outputLink value="http://www.google.com">
    <h:outputText value="Přejít na stránky Googlu"/>
</h:outputLink>

4.3.5. Selekce

Pro tvorbu selekcí máme v JSF k dispozici sedm tagů, které se dělí do třech skupin - tagy pro výběr více prvků z množiny, tagy pro výběr jednoho prvku z množiny a jeden tag pro binární volbu.

selectBooleanCheckbox

Toto je právě zmíněný tag pro binární volbu. Vytvoří jediný checkbox, který uživatel může buď zaškrtnout, nebo nechat prázdný. Atribut value musí odkazovat na proměnnou backing beanu, která je typu Boolean.

Příklad 4.6. Tag selectBooleanCheckbox

<h:selectBooleanCheckbox value="#{user.prijimatEmaily}"/>

selectManyListbox

Vytvoří listbox, ze kterého může uživatel vybrat libovolné množství položek. Jednotlivé položky se udávají buď v několika vnořených tazích selectItem, nebo v jednom tagu selectItems, jehož parametr value může odkazovat na kolekci, mapu, pole objektů či samostatný objekt typu SelectItem. Oba tyto tagy jsou z core tag library.

Příklad 4.7. Tag selectManyListbox

<h:selectManyListbox value="#{uzivatel.zaliby}">
    <f:selectItems value="#{user.seznamZalib}"/>
</h:selectManyListbox>

Objekt typu SelectItem má dvě hlavní vlastnosti - value a label. Label je popisek typu String, value však může být libovolného typu, neboť přijímá typ Object (viz příklad níže). Z datového typu, který si zde zvolíte, musíte následně vycházet při volbě datového typu, do kterého budete ukládat výsledek uživatelského výběru. Tato proměnná se udává v atributu value tagu selectManyListbox (viz příklad výše - #{uzivatel.zaliby}). V našem příkladu máme položky označené čísly, proměnná zaliby tedy musí být typu Integer respektive int. A jelikož se jedná o selekci s možností vícenásobného výběru, musí se jednat o pole. Samozřejmě musí být přítomen getter a setter. U selekcí bez možnosti vícenásobného výběru by se jednalo o obyčejnou proměnnou. Tento princip funguje ve všech následujících kolekcích

Příklad 4.8. Deklarace pole v backing beanu uzivatel

private int[] zaliby;
...
private SelectItem[] polozkyZalib = {
    new SelectItem(1, "sport"),
    new SelectItem(2, "četba"),
    new SelectItem(3, "zahrádkářství")
};

selectManyCheckbox

Funguje stejně jako tag selectManyListbox, jen místo listboxu vykresluje checkboxy, ze kterých se rovněž dá vybrat více hodnot. Užitečný je atribut layout, který říká v jakém směru se budou prvky seznamu vykreslovat. Může nabývat dvou hodnot - lineDirection (vykresluje prvky horizontálně) a pageDirection (vykresluje prvky vertikálně). V tomto příkladu jsme pro naplnění seznamu položkami použili několik tagů selectItem.

Příklad 4.9. Tag selectManyCheckbox

<h:selectManyCheckbox value="#{uzivatel.barvy}" layout="pageDirection">
    <f:selectItem itemValue="1" itemLabel="červená"/>
    <f:selectItem itemValue="2" itemLabel="modrá"/>
    <f:selectItem itemValue="3" itemLabel="bílá"/>
</h:selectManyCheckbox>

selectManyMenu

Opět funguje naprosto stejně jako předchozí dva tagy. Vykresluje combobox s možností vícenásobného výběru. Tento tag se v praxi příliš nepoužívá a některé prohlížeče mají s jeho zobrazováním problémy. Proto doporučuji používat raději selectManyListbox.

selectOneRadio

Vykresluje skupinu radiobuttonů, ze kterých lze vybrat právě jednu položku. Jinak funguje stejně jako předchozí tagy. Stejně jako u tagu selectManyCheckbox i zde lze uplatnit atribut layout.

selectOneListbox

Stejná funkce jako selectManyListbox s tím rozdílem, že lze vybrat pouze jedinou položku.

selectOneMenu

Vykresluje combobox, ze kterého lze vybrat právě jednu položku. Jinak funguje stejně jako předchozí tagy.

4.3.6. Zprávy

Během životního cyklu aplikace se mohou nakumulovat nějaké zprávy, které jsou spravovány instancí třídy FacesContext (tuto třídu jsem již zmínil v sekci 3.3.2.5 – „Namapování požadavků na instanci FacesServlet). Většinou se jedná o zprávy informující o chybě konverze či validace. Při renderování můžete tyto zprávy na stránce vykreslit a to pomocí dvou tagů:

message

Tento tag vykreslí pouze jednu zprávu vztahující se ke konkrétní komponentě. Tu určíme pomocí atributu for, do kterého zadáme id komponenty.

Příklad 4.10. Tag message

<h:message for="jmeno" style="color: red;"/>

messages

Tag messages vykreslí veškerý seznam zpráv, které FacesContext během celého životního cyklu nakumuloval. Pomocí atributu layout, který může nabývat buď hodnoty list, nebo table, určíme, zda se mají zprávy vykreslit v HTML tabulce či HTML seznamu.

Příklad 4.11. Tag messages

 <h:messages style="color: red;" layout="list"/>

Používání těchto dvou tagů je velice důležité, aby uživatel věděl, proč se mu po potvrzení formuláře zobrazuje znovu ta stejná stránka. Ve zprávách byste měli uživatele informovat o tom, jaké chyby se dopustil a jaké podmínky musí vstupní data splňovat.

4.3.7. Panely

V JSF existují dva tagy, které vám pomáhají při tvorbě layoutu stránky.

panelGrid

K definici layoutu používá obyčejnou tabulku. Pomocí atributu columns můžeme určit počet sloupců (defaultní hodnota je 1). Dovnitř tagu následně vkládáme komponenty, které se řadí na řádku zleva doprava a po sloupcích shora dolů. Počet řádků tedy není třeba určovat. Nastaví se automaticky podle počtu komponent, které do tagu vložíme.

Příklad 4.12. Tag panelGrid

<h:panelGrid columns="2">
    <h:outputText value="#{msgs.namePrompt}:"/>
    <h:inputText id="jmeno" value="#{user.jmeno}" required="true"/>
    <h:outputText value="#{msgs.agePrompt}:"/>
    <h:inputText size="3" value="#{user.vek}"/>
</h:panelGrid>

panelGroup

Tag panelGroup seskupí několik prvků do jedné skupiny. Používá k tomu buďto HTML tag div, či span, v závislosti na hodnotě atributu layout.

Příklad 4.13. Tag panelGroup

<h:panelGroup layout="block">
    <h:inputText id="jmeno" value="#{user.jmeno}">
    <h:message for="jmeno"/>
</h:panelGroup>

4.3.8. Ostatní

Zbývají dva tagy, které se nehodily do žádné z předchozích skupin. Jedná se o tag pro tabulku a tag pro obrázek.

graphicImage

Velice jednoduchý tag, který vykreslí obrázek pomocí HTML tagu img. Atribut value udává cestu k souboru obrázku.

Příklad 4.14. Tag graphicImage

<h:graphicImage value="obr1.png"/>

dataTable

Smysluplný popis možností JSF tabulky by byl pro tuto práci příliš rozsáhlý. Proto se pro více informací o tabulkách podívejte např. do [8] či [3].



[31] To platí pouze v případě, že je atribut type nastaven na submit, což je také defaultní hodnota. Další možná hodnota je reset. V tom případě tlačítko pouze nuluje všechna pole formuláře.

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.