In einem Servlet basierten Artefakt, wie @WebServlet, @WebFilterund @WebListenerkönnen Sie ein „plain vanilla“ JSF greifen @ManagedBean @RequestScopeddurch:
Bean bean = (Bean) request.getAttribute("beanName");
und @ManagedBean @SessionScopedvon:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
und @ManagedBean @ApplicationScopedvon:
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 @Namedanstelle 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 @ViewScopedda die Bean nur anhand des JSF-Ansichtsstatus identifiziert werden kann und nur verfügbar ist, wenn die FacesServletaufgerufen wurde. In einem Filter, der zuvor ausgeführt wird, wird der Zugriff auf ein @InjectEd @ViewScopedimmer 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 @Namedoder @WebServletoder einem anderen Artefakt. Es funktioniert wirklich @ManagedBeannur im Inneren .
Wenn Sie sich nicht in einem befinden @ManagedBean, das jedoch FacesContextverfü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: