Problem

How can a JSF event listener class access another managed bean? See scenario below :

JSF page…

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

country managed 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());
 
	}
 
}

Solution

Actually, there are many ways to access an existing managed bean from an event listener class or another managed bean. See examples :

1. getApplicationMap()

If country managed bean is declared in application scope.

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

2. getRequestMap()

If country managed bean is declared in request scope.

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

3. getSessionMap()

If country managed bean is declared in session scope.

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

4. ELResolver()

Using ELResolver.

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

5. ValueExpression()

Using ValueExpression.

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

6. evaluateExpressionGet()

Using evaluateExpressionGet.

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

Reference

  1. getApplicationMap() java Doc
  2. getRequestMap() JavaDoc
  3. getSessionMap() JavaDoc
  4. getELResolver() JavaDoc
  5. createValueExpression() JavaDoc
  6. evaluateExpressionGet() JavaDoc
Note : You can find more similar articles at - JSF 2 Tutorials