在任何与Servlet相关的类中按名称获取JSF托管bean [英] Get JSF managed bean by name in any Servlet related class
问题描述
我正在尝试编写一个自定义servlet(用于AJAX / JSON),其中我想按名称引用我的 @ManagedBeans
。我希望能够映射:
I'm trying to write a custom servlet (for AJAX/JSON) in which I would like to reference my @ManagedBeans
by name. I'm hoping to map:
http:// host / app / myBean / myProperty
到:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
是否可以从常规servlet按名称加载bean?有没有我可以使用的JSF servlet或帮助器?
Is it possible to load a bean by name from a regular servlet? Is there a JSF servlet or helper I could use for it?
我似乎被Spring所破坏,其中所有这一切都太明显了。
I seem to be spoilt by Spring in which all this is too obvious.
推荐答案
在Servlet中,您可以通过以下方式获取请求范围的bean:
In a Servlet, you can get request scoped beans by:
Bean bean = (Bean) request.getAttribute("beanName");
和会话范围内的bean:
and session scoped beans by:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
和应用程序范围内的bean:
and application scoped beans by:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
如果您正在运行依赖注入功能框架/容器和bean由CDI的 @Named
而不是JSF的 @ManagedBean
,它更加轻松:
If you're running in a dependency injection capable framework/container and the bean is managed by CDI's @Named
instead of JSF's @ManagedBean
, it's even more easy:
@Inject
private Bean bean;
无论范围如何,当你实际上在 FacesContext
(即当前的HTTP请求已通过 FacesServlet
),然后正常的JSF2方式是使用 应用程序#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");
然而,当你已经在一个< a href =http://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedBean.html =noreferrer> @ManagedBean
,然后使用 @ManagedProperty
更清晰,因为它更具声明性。
However, when you're already inside a @ManagedBean
, then using @ManagedProperty
is cleaner since it's more declarative.
@ManagedProperty("#{bean}")
private Bean bean;
这篇关于在任何与Servlet相关的类中按名称获取JSF托管bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!