W artefaktu oparte serwletu, takich jak @WebServlet, @WebFilteri @WebListenermożna złapać „plain vanilla” JSF @ManagedBean @RequestScopedprzez:
Bean bean = (Bean) request.getAttribute("beanName");
i @ManagedBean @SessionScopedprzez:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
i @ManagedBean @ApplicationScopedprzez:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Zwróć uwagę, że wymaga to wcześniejszego automatycznego utworzenia ziarna przez JSF. W przeciwnym razie te powrócą null. Następnie musisz ręcznie utworzyć fasolę i użyć setAttribute("beanName", bean).
Jeśli możesz użyć CDI @Namedzamiast JSF 2.3, który jest przestarzały @ManagedBean, to jest to jeszcze prostsze, zwłaszcza że nie musisz już ręcznie tworzyć komponentów bean:
@Inject
private Bean bean;
Zwróć uwagę, że to nie zadziała, gdy używasz, @Named @ViewScopedponieważ komponent bean można zidentyfikować tylko na podstawie stanu widoku JSF i jest to dostępne tylko wtedy, gdy FacesServletzostał wywołany. Więc w filtrze, który działa wcześniej, dostęp do @Injected @ViewScopedzawsze wyrzuci ContextNotActiveException.
Dopiero gdy jesteś w środku @ManagedBean, możesz użyć @ManagedProperty:
@ManagedProperty("#{bean}")
private Bean bean;
Należy pamiętać, że to nie działa wewnątrz @Namedlub @WebServletlub innego artefaktu. To naprawdę działa @ManagedBeantylko w środku .
Jeśli nie jesteś w środku a @ManagedBean, ale FacesContextjest łatwo dostępny (tj. FacesContext#getCurrentInstance()Nie zwraca null), możesz również użyć Application#evaluateExpressionGet():
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
które można uprościć w następujący sposób:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
i może być używany w następujący sposób:
Bean bean = findBean("bean");
Zobacz też: