在基于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
在调用时才可用。因此,在此之前运行的过滤器中,访问@Inject
ed @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");
也可以看看: