在基于 servlet 的工件中,例如 @WebServlet、@WebFilter 和 @WebListener,您可以通过以下方式获取“普通版”JSF @ManagedBean @RequestScoped:
Bean bean = (Bean) request.getAttribute("beanName");
和@ManagedBean @SessionScoped:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
和@ManagedBean @ApplicationScoped:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
请注意,这预先要求 bean 已经由 JSF 预先自动创建。否则这些将返回null。然后您需要手动创建 bean 并使用 setAttribute("beanName", bean)。
如果您能够使用 CDI @Named 而不是自 JSF 2.3 弃用的 @ManagedBean,那么它会更加容易,特别是因为您不再需要手动创建 bean:
@Inject
private Bean bean;
请注意,当您使用 @Named @ViewScoped 时,这将不起作用,因为 bean 只能由 JSF 视图状态标识,并且仅在调用 FacesServlet 时可用。所以在之前运行的过滤器中,访问@Injected @ViewScoped 总是会抛出ContextNotActiveException。
只有在@ManagedBean里面,才能使用@ManagedProperty:
@ManagedProperty("#{bean}")
private Bean bean;
请注意,这在 @Named 或 @WebServlet 或任何其他工件中不起作用。它真的只在@ManagedBean 内有效。
如果您不在@ManagedBean 中,但FacesContext 很容易获得(即FacesContext#getCurrentInstance() 不返回null),您也可以使用Application#evaluateExpressionGet():
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
可以方便如下:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
并且可以如下使用:
Bean bean = findBean("bean");
另见: