6.2. Zpracování událostí listenerem

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.

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.