Accéder à un bean géré à partir d’un écouteur d’événement - JSF

Accéder à un bean géré à partir de l'écouteur d'événements - JSF

Problème

Comment une classe d'écouteur d'événements JSF peut-elle accéder à un autre bean géré? Voir le scénario ci-dessous:

Page JSF…


    
    

haricot géré par le pays…

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

    }

}

Solution

En fait, il existe de nombreuses façons d'accéder à un bean géré existant à partir d'une classe d'écouteur d'événements ou d'un autre bean géré. Voir des exemples:

1. getApplicationMap ()

Si le bean géré par le pays est déclaré dans la portée de l'application.

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

2. getRequestMap ()

Si le bean géré par pays est déclaré dans la portée de la demande.

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

3. getSessionMap ()

Si le bean géré par pays est déclaré dans la portée de la session.

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

4. ELResolver ()

Utilisation d'ELResolver.

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

5. ValueExpression ()

Utilisation de ValueExpression.

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

6. assessExpressionGet ()

Utilisation de assessExpressionGet.

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