Obsah
Proces zpracování událostí v JSF vychází z JavaBeans modelu. Rovněž se zde používají třídy událostí a třídy listenerů, které implementují určité rozhraní.
Když některá komponenta vygeneruje událost, je vytvořena instance příslušné třídy události, jež obsahuje informace o svém původci. Obsah těchto informací je odvislý od typu události (pro více informací o třídách událostí viz [6]). Jestliže chceme tuto událost zpracovat, je zapotřebí připojit ke komponentě, která událost generuje, instanci listeneru. Ve třídě listeneru je implementována metoda, která na vzniklou událost určitým způsobem reaguje.
V JSF existují tři typy událostí:
Action
event - je generována komponentami, které implementují
rozhraní javax.faces.component.ActionSource
, což je např.
komponenta UICommand
. Událost může tedy nastat třeba při
stisku tlačítka či odkazu. Tento typ události představuje třída
javax.faces.event.ActionEvent
.
Value-change
event - je generována komponentami, které implementují
rozhraní javax.faces.component.EditableValueHolder
, což
jsou například UIInput
,
UISelectOne
a další komponenty, které umožňují
uživateli zadat vstupní data. Událost může tedy nastat třeba při zaškrtnutí
checkboxu, změny výběru v listboxu atp. Tento typ události je představován
třídou javax.faces.event.ValueChangeEvent
.
Data-model event - může nastat při manipulaci s tabulkami. Jedná se však o složitější událost, jejíž popis je mimo rozsah této práce (pro více informací o data-model event viz [5]).
Tyto události lze v JSF zpracovávat dvěma způsoby. Buďto můžete vytvořit výše popsanou
třídu listeneru, která bude implementovat rozhraní
ActionListener
respektive
ValueChangeListener
, nebo stačí napsat pouze metodu backing beanu, jež událost zpracuje.
Metoda, která bude zpracovávat události, musí být veřejná, musí vracet typ
void
a jako parametr musí přijímat některou z tříd událostí. Může
tedy vypadat např. takto:
Příklad 6.1. Metoda backing beanu, která zpracovává událost
public void zapnoutVypnout(ActionEvent event) { UICommand uic = (UICommand)event.getSource(); if (uic.getValue().equals("zapnout")) { uic.setValue("Vypnout"); } else { uic.setValue("Zapnout"); } }
V tomto případě ukládáme do proměnné uic
odkaz na tlačítko, ze
kterého byla akce vyvolána, a na základě jeho hodnoty value
mu pak
nastavujeme popisek.
Když chceme ke komponentě přiřadit metodu, která zpracovává události, využijeme
atribut actionListener
respektive valueChangeListener
.
Přiřazení naší metody k tlačítku by vypadalo následovně:
Příklad 6.2. Přiřazení metody pro zpracování událostí ke komponentě tlačítka
<h:commandButton value="Zapnout" actionListener="#{bean.zapnoutVypnout}"/>
Tlačítko tedy bude mít ze začátku nastaven popisek Zapnout. Když na něj pak budeme klikat, popisek se bude měnit.