Druhou možností jak zpracovávat události je vytvořit si třídu, která implementuje
příslušné rozhraní (ActionListener
v případě action event či
ValueChangeListener
v případě value-change event).
Každé z těchto rozhraní má pouze jednu metodu, kterou je třeba implementovat. V
případě ActionListener
je to metoda
processAction(ActionEvent)
a v případě
ValueChangeListener
metoda
processValueChange(ValueChangeEvent)
. V předešlé sekci jsem uvedl příklad zpracování action event, implementaci listeneru proto budu demonstrovat na
value-change event.
Příklad 6.3. Třída implementující rozhraní
ValueChangeListener
package userBeans; import java.util.Locale; import javax.faces.context.FacesContext; import javax.faces.event.ValueChangeEvent; public class ZmenaStatu implements javax.faces.event.ValueChangeListener { public void processValueChange(ValueChangeEvent event) { FacesContext context = FacesContext.getCurrentInstance(); if (((String)event.getNewValue()).equals("us")) { context.getViewRoot().setLocale(Locale.US); } else { context.getViewRoot().setLocale(new Locale("cs", "CZ")); } } }
Třída ValueChangeEvent
obsahuje informace o staré a nové
hodnotě komponenty, která akci vyvolala. V if
podmínce zjišťujeme novou hodnotu např. comboboxu
a na jejím základě nastavujeme hodnotu locale[32] pro view root (pro více informací o
metodách tříd FacesContext
a ViewRoot
viz [6]).
Pro přiřazení tříd listeneru ke komponentám se
místo atributů používají tagy actionListener
a
valueChangeListener
. Oba se nacházejí v core tag library a v atributu type
přijímají plný název
třídy listeneru. Přiřazení výše popsaného
listeneru ke comboboxu by vypadalo následovně:
Příklad 6.4. Přiřazení třídy pro zpracování událostí ke komponentě comboboxu
<h:selectOneMenu value="#{objednavka.vybranyStat}"> <f:valueChangeListener type="userBeans.ZmenaStatu"/> <f:selectItems value="#{objednavka.staty}"/> </h:selectOneMenu>
V tomto případě by se listener spustil až poté,
co byste potvrdili formulář stiskem tlačítka. Pokud byste chtěli zpracovat událost
ihned po změně hodnoty comboboxu, stačilo by k
tagu selectOneMenu
přiřadit atribut onchange
s hodnotou
submit()
. Tím se odvoláte na funkci JavaScriptu, která zajistí
okamžité potvrzení formuláře.
Příklad 6.5. Přiřazení třídy pro zpracování událostí ke komponentě comboboxu II
<h:selectOneMenu value="#{objednavka.vybranyStat}" onchange="submit()"> <f:valueChangeListener type="userBeans.ZmenaStatu"/> <f:selectItems value="#{objednavka.staty}"/> </h:selectOneMenu>
Jak metoda backing beanu tak třída listeneru mají své výhody i nevýhody. Metoda backing beanu je snazší na implementaci. Není třeba tvořit novou třídu a máte také jednodušší přístup k proměnným backing beanu pro případ, že je chcete během zpracování události modifikovat. Implementace listeneru vám naproti tomu dává možnost přiřadit komponentě více než jeden listener. Tagů totiž můžete do komponenty vnořit libovolné množství. Listenery jsou pak volány v pořadí v jakém jsou napsány. Pokud je zároveň přítomen atribut listeneru, je volán ještě před listenery v tazích.
[32] Na základě hodnoty locale se přizpůsobuje národní prostředí aplikace. Při vypisování peněžních hodnot se například nastaví příslušná měna atp. Pro více informací o třídě Locale viz http://java.sun.com/javase/6/docs/api.