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