在基于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
时,此方法无效,因为只有在调用
FacesServlet
时,bean 才能被 JSF 视图状态识别。所以在运行在其之前的过滤器中访问
@Inject
@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");
参见: