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.
