問題
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);
リファレンス
java Doc]。
getRequestMap()
JavaDoc]。
http://download.oracle.com/docs/cd/E17802__01/j2ee/j2ee/javaserverfaces/1.2/docs/api/javax/faces/context/ExternalContext.html#getSessionMap%28%29
[getSessionMap()
JavaDoc]。
http://download.oracle.com/javaee/5/api/javax/faces/application/Application.html#getELResolver%28%29
[getELResolver()
JavaDoc]。
http://download.oracle.com/javaee/5/api/javax/el/ExpressionFactory.html#createValueExpression%28javax.el.ELContext,%20java.lang.String,%20java.lang.Class%29
[createValueExpression( )
JavaDoc]。
http://edocs.beasys.co.jp/e-docs/ja-jp/29
[evaluateExpressionGet()
JavaDoc]
リンク://タグ/jsf2/[jsf2]