如何在任何与Servlet相关的类中获取JSF托管bean的名称?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (52)

我试图编写一个自定义的servlet(用于AJAX / JSON),我想在其中引用我@ManagedBeans的名字。我希望能够映射:

http://host/app/myBean/myProperty

至:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

是否可以通过常规servlet的名称加载bean?有没有可用于它的JSF servlet或helper?

提问于
用户回答回答于

在Servlet中,你可以通过以下方式获取请求范围的bean:

Bean bean = (Bean) request.getAttribute("beanName");

和会话范围的bean:

Bean bean = (Bean) request.getSession().getAttribute("beanName");

和应用程序范围的bean:

Bean bean = (Bean) getServletContext().getAttribute("beanName");

如果你运行的是依赖注入能力的框架/容器,并且该bean由CDI @Named而不是JSF 来管理@ManagedBean,那更容易:

@Inject
private Bean bean;

不管范围如何,当你真正处于内部时FacesContext(即当前的HTTP请求已经通过FacesServlet),那么普通的JSF2方法就是使用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");

但是,当你已经在a中时@ManagedBean,使用@ManagedProperty更清晰,因为它更具说明性。

@ManagedProperty("#{bean}")
private Bean bean;
用户回答回答于

我使用以下方法:

public static <T> T getBean(final String beanName, final Class<T> clazz) {
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName);
}

这允许我以类型化的方式获取返回的对象。

扫码关注云+社区