W artefaktu oparte serwletu, takich jak @WebServlet
, @WebFilter
i @WebListener
można złapać „plain vanilla” JSF @ManagedBean @RequestScoped
przez:
Bean bean = (Bean) request.getAttribute("beanName");
i @ManagedBean @SessionScoped
przez:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
i @ManagedBean @ApplicationScoped
przez:
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 @Named
zamiast 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 @ViewScoped
ponieważ komponent bean można zidentyfikować tylko na podstawie stanu widoku JSF i jest to dostępne tylko wtedy, gdy FacesServlet
został wywołany. Więc w filtrze, który działa wcześniej, dostęp do @Inject
ed @ViewScoped
zawsze 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 @Named
lub @WebServlet
lub innego artefaktu. To naprawdę działa @ManagedBean
tylko w środku .
Jeśli nie jesteś w środku a @ManagedBean
, ale FacesContext
jest ł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ż: