Доступ к управляемому бину из прослушивателя событий - JSF

Доступ к управляемому компоненту из прослушивателя событий - JSF

проблема

Как класс слушателя событий JSF может получить доступ к другому управляемому бину? Смотрите сценарий ниже:

Страница JSF…


    
    

бин, управляемый страной…

package com.example;

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.example;

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());

    }

}

Решение

На самом деле, существует много способов доступа к существующему управляемому бину из класса прослушивателя событий или другого управляемого бина. Смотрите примеры:

1. getApplicationMap ()

Если управляемый компонент страны объявлен в области применения.

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

2. getRequestMap ()

Если управляемый компонент страны объявляется в области запроса.

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

3. getSessionMap ()

Если управляемый компонент страны объявлен в области действия сеанса.

    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 ()

С помощью defineExpressionGet.

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