イベントリスナーからマネージドBeanにアクセス – JSF
問題
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]