JSF: Usare un Bean anche da altre classi Java
Attraverso la dichiarazione di un bean (di livello application, session o request) nel file faces-config.xml, è possibile, tramite le Language Expression (LE), usare gli oggetti ed i attributi nelle pagine web, jsp o xhtml che siano. Ma spesso mi è stato chiesto come è possibile accedere a queste stesse istanze di bean direttamente da codice java di altri bean o classi dell’applicazione JSF.
Io sono solito crearmi un file di utilità, dove tra i vari metodi inserisco dei metodi statici che mi permettono di prendere i bean nel loro preciso posizionamento (application, session o request), e, se ancora non lo sono, di instanziarli. Un esempio di questo genere di metodo per un bean a livello sessione può essere:
public static SessionBean getSessionBean() {
SessionBean ilBean = ((SessionBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("SessionBean"));
if (ilBean == null) {//il bean non esiste a livello sessione
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("SessionBean", new SessionBean());
}
return ((SessionBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("SessionBean"));
}
Ovviamente nel file faces-config.xml deve essere dichiarato il bean di scope session e nome SessionBean.
Per gli altri due tipi di scope, è possibile usare i metodi che ritornano una Collection getApplicationMap() e getRequestMap(), rispettivamente per gli oggetti che si hanno a livello applicazione e livello richiesta.


