JSF 2 valueChangeListenerの例

JSF 2 valueChangeListenerの例

ユーザーがh:inputTexth:selectOneMenuなどの入力コンポーネントを変更すると、JSF「value change event」が起動されます。

それを実装する2つの方法:

1. Method binding –入力コンポーネントで、「valueChangeListener」属性にBeanのメソッドを直接指定しました。
JSF…


    

Java…
値変更イベントと相互作用するメソッドは、ValueChangeEventパラメータを受け入れる必要があります。

@ManagedBean(name="bean")
@SessionScoped
public class BeanBean{

    public void valueChangeMethod(ValueChangeEvent e){
        //...
    }

}

2. ValueChangeListener interface –入力コンポーネントで、内部に「f:valueChangeListener」タグを追加し、ValueChangeListenerインターフェイスの実装クラスを指定しました。
JSF…


    
    

Java…
ValueChangeListenerインターフェイスを実装し、processValueChange()メソッドをオーバーライドします。

public class ValueListenerXXX implements ValueChangeListener{

    @Override
    public void processValueChange(ValueChangeEvent event)
            throws AbortProcessingException {

        //...

    }
}

Note
これを機能させるには、onchange=”submit()”JavaScriptを入力コンポーネントにアタッチする必要があります。それ以外の場合、イベントは発生しません。

完全なvalueChangeListenerの例

これは、ドロップダウンボックス(h:selectOneMenu)とテキストボックス(h:inputText)を備えたJSF 2.0アプリケーションです。ユーザーがドロップダウンボックスに変更を加えると、「値の変更イベント」が発生し、テキストボックスが次のように更新されます。新しく選択されたドロップダウンボックスの値。

この例は、「Method binding」と「ValueChangeListener」の両方の方法で示されています。

1. メソッドバインディング

デモ用の国とロケールコードのリストを提供するカントリーBean。 入力コンポーネントの「valueChangeListener」属性を使用して、Beanのメソッドをバインドできます。 下記参照 :

CountryBean.java

package com.example;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ValueChangeEvent;

@ManagedBean(name="country")
@SessionScoped
public class CountryBean implements Serializable{

    private static final long serialVersionUID = 1L;

    private static Map countries;

    private String localeCode = "en"; //default value

    static{
        countries = new LinkedHashMap();
        countries.put("United Kingdom", "en"); //label, value
        countries.put("French", "fr");
        countries.put("German", "de");
        countries.put("China", "zh_CN");
    }

    public void countryLocaleCodeChanged(ValueChangeEvent e){
        //assign new value to localeCode
        localeCode = e.getNewValue().toString();

    }

    public Map getCountryInMap() {
        return this.countries;
    }

    public String getLocaleCode() {
        return localeCode;
    }

    public void setLocaleCode(String localeCode) {
        this.localeCode = localeCode;
    }

}

JSFページ



    

        

JSF 2 valueChangeListener example

Selected country : Select a country {method binding}:

2. ValueChangeListenerインターフェース

国別Beanを再利用して、国とロケールコードのリストを提供します。 ValueChangeListenerインターフェースを実装し、「f:valueChangeListener」タグを介してバインドします。 下記参照 :

CountryValueListener.java

package com.example;

import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;

public class CountryValueListener implements ValueChangeListener{

    @Override
    public void processValueChange(ValueChangeEvent event)
            throws AbortProcessingException {

        //access country bean directly
        CountryBean country = (CountryBean) FacesContext.getCurrentInstance().
            getExternalContext().getSessionMap().get("country");

        country.setLocaleCode(event.getNewValue().toString());

    }

}

JSFページ



    

        

JSF 2 valueChangeListener example

Selected country : Select a country {ValueChangeListener class}:

Demo

デフォルトでは、国「イギリス」が選択されています。

jsf2-ValueChangeListener-example-1

国のドロップダウンボックスの値が変更された場合は、valueChangeListenerを起動し、新しく選択したドロップドローボックスの値でテキストボックスの値を更新します。

jsf2-ValueChangeListener-example-2

ソースコードをダウンロード

ダウンロード–JSF-2-ValueChangeListener-Example.zip(10KB)