在基于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");
请注意,这需要先由JSF自动创建Bean。否则这些会回来null。然后,您需要手动创建Bean并使用setAttribute("beanName", bean)。
如果您能够使用CDI @Named而不是自JSF 2.3弃用以来的版本@ManagedBean,那么它会更加容易,尤其是因为您不再需要手动创建bean了:
@Inject
private Bean bean;
请注意,这在您使用时将不起作用,@Named @ViewScoped因为只能通过JSF视图状态来标识Bean,并且仅FacesServlet在调用时才可用。因此,在此之前运行的过滤器中,访问@Injected @ViewScoped将始终throw 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");
也可以看看: