In un artefatto basato su servlet, come @WebServlet
, @WebFilter
e @WebListener
, puoi prendere un JSF "plain vanilla" @ManagedBean @RequestScoped
:
Bean bean = (Bean) request.getAttribute("beanName");
e @ManagedBean @SessionScoped
da:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
e @ManagedBean @ApplicationScoped
da:
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 @Named
invece 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 @ViewScoped
perché 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 @Inject
ed @ViewScoped
verrà 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 @Named
o @WebServlet
o qualsiasi altro artefatto. Funziona davvero @ManagedBean
solo 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: