在任何与Servlet相关的类中按名称获取JSF托管bean [英] Get JSF managed bean by name in any Servlet related class

查看:261
本文介绍了在任何与Servlet相关的类中按名称获取JSF托管bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个自定义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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆