Greifen Sie über den Ereignislistener - JSF - auf eine verwaltete Bean zu

Greifen Sie über den Ereignis-Listener (JSF) auf eine verwaltete Bean zu

Problem

Wie kann eine JSF-Ereignis-Listener-Klasse auf eine andere verwaltete Bean zugreifen? Siehe folgendes Szenario:

JSF-Seite…


    
    

Land verwaltete Bohne…

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

    }

}

Lösung

Tatsächlich gibt es viele Möglichkeiten, von einer Ereignis-Listener-Klasse oder einer anderen verwalteten Bean auf eine vorhandene verwaltete Bean zuzugreifen. Siehe Beispiele:

1. getApplicationMap ()

Wenn Country Managed Bean im Anwendungsbereich deklariert ist.

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

2. getRequestMap ()

Wenn Country Managed Bean im Anforderungsbereich deklariert ist.

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

3. getSessionMap ()

Wenn Country Managed Bean im Sitzungsbereich deklariert ist.

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

4. ELResolver ()

ELResolver verwenden.

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

5. ValueExpression ()

Verwenden von ValueExpression.

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

6. valuExpressionGet ()

Verwenden von EvaluateExpressionGet.

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