In einem Servlet basierten Artefakt, wie @WebServlet
, @WebFilter
und @WebListener
können Sie ein „plain vanilla“ JSF greifen @ManagedBean @RequestScoped
durch:
Bean bean = (Bean) request.getAttribute("beanName");
und @ManagedBean @SessionScoped
von:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
und @ManagedBean @ApplicationScoped
von:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Beachten Sie, dass dies voraussetzt, dass die Bean bereits zuvor von JSF automatisch erstellt wurde. Sonst werden diese zurückkehren null
. Sie müssten dann die Bean manuell erstellen und verwenden setAttribute("beanName", bean)
.
Wenn Sie CDI @Named
anstelle von JSF 2.3 verwenden können @ManagedBean
, ist dies noch einfacher, insbesondere weil Sie die Beans nicht mehr manuell erstellen müssen:
@Inject
private Bean bean;
Beachten Sie, dass dies bei Verwendung nicht funktioniert, @Named @ViewScoped
da die Bean nur anhand des JSF-Ansichtsstatus identifiziert werden kann und nur verfügbar ist, wenn die FacesServlet
aufgerufen wurde. In einem Filter, der zuvor ausgeführt wird, wird der Zugriff auf ein @Inject
Ed @ViewScoped
immer ausgelöst ContextNotActiveException
.
Nur wenn Sie drinnen sind @ManagedBean
, können Sie verwenden @ManagedProperty
:
@ManagedProperty("#{bean}")
private Bean bean;
Beachten Sie, dass dies nicht in einem nicht funktioniert @Named
oder @WebServlet
oder einem anderen Artefakt. Es funktioniert wirklich @ManagedBean
nur im Inneren .
Wenn Sie sich nicht in einem befinden @ManagedBean
, das jedoch FacesContext
verfügbar ist (dh FacesContext#getCurrentInstance()
nicht zurückkehrt null
), können Sie auch Folgendes verwenden Application#evaluateExpressionGet()
:
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
was wie folgt bequem sein kann:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
und kann wie folgt verwendet werden:
Bean bean = findBean("bean");
Siehe auch: