問題

JSFイベント・リスナー・クラスは、別のマネージドBeanにどのようにアクセスできますか?以下のシナリオを参照してください。

__JSFページ…​

<h:selectOneMenu value="#{country.localeCode}" onchange="submit()">
    <f:valueChangeListener type="com.mkyong.CountryValueListener"/>
    <f:selectItems value="#{country.countryInMap}"/>
</h:selectOneMenu>


countryマネージドBean …​

package com.mkyong;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

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

        private String localeCode;

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

__ValueChangeListener …​

package com.mkyong;

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 {

       //how to access the existing country managed bean?
       //country.setLocaleCode(event.getNewValue().toString());

    }

}

解決策

実際には、イベントリスナクラスまたは別のマネージドBeanから既存のマネージドBeanにアクセスする方法はたくさんあります。例を参照してください。

1. getApplicationMap()

カントリーマネージドBeanがアプリケーションスコープで宣言されている場合。

    CountryBean country = (CountryBean) FacesContext.getCurrentInstance().
        getExternalContext().getApplicationMap().get("country");

2. getRequestMap()

カントリーマネージドBeanがリクエストスコープで宣言されている場合。

    CountryBean country = (CountryBean) FacesContext.getCurrentInstance().
        getExternalContext().getRequestMap().get("country");

3. getSessionMap()

カントリーマネージドBeanがセッションスコープで宣言されている場合。

    CountryBean country = (CountryBean) FacesContext.getCurrentInstance().
        getExternalContext().getSessionMap().get("country");

4. ELResolver()

ELResolverの使用。

    FacesContext context = FacesContext.getCurrentInstance();
      CountryBean country = (CountryBean) context.
        getELContext().getELResolver().getValue(context.getELContext(), null,"country");

5. ValueExpression()

ValueExpressionの使用。

    FacesContext context = FacesContext.getCurrentInstance();
      CountryBean country = (CountryBean) context.getApplication().getExpressionFactory()
            .createValueExpression(context.getELContext(), "#{country}", CountryBean.class)
              .getValue(context.getELContext());

6. evaluateExpressionGet()

evaluateExpressionGetを使用します。

    FacesContext context = FacesContext.getCurrentInstance();
      CountryBean country = (CountryBean)context.getApplication()
            .evaluateExpressionGet(context, "#{country}", CountryBean.class);