In un artefatto basato su servlet, come @WebServlet, @WebFiltere @WebListener, puoi prendere un JSF "plain vanilla" @ManagedBean @RequestScoped:
Bean bean = (Bean) request.getAttribute("beanName");
e @ManagedBean @SessionScopedda:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
e @ManagedBean @ApplicationScopedda:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Notare che questo prerequisito che il bean sia già autocreato da JSF in anticipo. Altrimenti questi torneranno null. Dovresti quindi creare manualmente il bean e utilizzare setAttribute("beanName", bean).
Se sei in grado di utilizzare CDI @Namedinvece del deprecato JSF 2.3 @ManagedBean, allora è ancora più facile, soprattutto perché non hai più bisogno di creare manualmente i bean:
@Inject
private Bean bean;
Nota che questo non funzionerà quando lo stai usando @Named @ViewScopedperché il bean può essere identificato solo dallo stato di visualizzazione JSF ed è disponibile solo quando FacesServletè stato invocato. Quindi in un filtro che viene eseguito prima, l'accesso a un @Injected @ViewScopedverrà sempre generato ContextNotActiveException.
Solo quando sei dentro @ManagedBean, puoi usare @ManagedProperty:
@ManagedProperty("#{bean}")
private Bean bean;
Nota che questo non funziona all'interno di un @Namedo @WebServleto qualsiasi altro artefatto. Funziona davvero @ManagedBeansolo all'interno .
Se non sei all'interno di un @ManagedBean, ma FacesContextè immediatamente disponibile (cioè FacesContext#getCurrentInstance()non ritorna null), puoi anche usare Application#evaluateExpressionGet():
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
che può essere convenientemente come segue:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
e può essere utilizzato come segue:
Bean bean = findBean("bean");
Guarda anche: