从Servlet访问JSF managedBean

从Servlet访问JSF managedBean,jsf,servlets,javabeans,Jsf,Servlets,Javabeans,我需要知道从servlet访问JSF managedBean(定义为具有应用程序范围)的最佳方法是什么。 目前,我的servlet中有如下内容: MyApplicationScopeBean bean = null; try { FacesContext fContext = FacesUtil.getFacesContext(req, resp); ServletContext sc = (ServletContext) fContext.getExternalContex

我需要知道从servlet访问JSF managedBean(定义为具有应用程序范围)的最佳方法是什么。 目前,我的servlet中有如下内容:

  MyApplicationScopeBean bean = null;
  try {
   FacesContext fContext = FacesUtil.getFacesContext(req, resp);
   ServletContext sc = (ServletContext) fContext.getExternalContext().getContext();
   bean = (MyApplicationScopeBean) sc.getAttribute("myManagedBean");   
  } catch (Exception e) {
   e.printStackTrace();
  }
FacesUtil.java(如中所述):

当试图从servlet访问bean时,我总是得到一个null<你有什么建议? 我正在Tomcat6上运行JSF1.2
感谢您的帮助。

JSF将应用程序范围的托管bean存储在数据库中。在servlet中,
ServletContext
仅通过继承的方法可用。您不需要在其周围手动创建一个完整的
FacesContext
。这只是一项不必要的昂贵任务

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Bean bean = (Bean) getServletContext().getAttribute("bean");
    // ...
}
如果它返回
null
,那么它仅仅意味着JSF还没有开始为您自动创建bean(即servlet调用得太早)。然后您需要自己创建并存储它。如果托管bean名称(属性键)相同,JSF将使用它

    if (bean == null) {
        bean = new Bean();
        getServletContext().setAttribute("bean", bean);
    }

也就是说,这个servlet的目的是什么?您是否试图以错误的方式实现某些功能需求

好的,现在我知道问题出在哪里了。我有一个managedBean,它有一个方法来创建我需要的bean,但是当我访问servlet时,它不在ServletContext中,因为它从来没有真正加载过。servlet的目的是使用OutputStream编写一个文件,以便我的用户能够保存webservice调用的结果(PDF文件)。我知道这不是最好的方法,但我在这里面临一个最后期限,任何帮助都是值得赞赏的,您也可以在托管bean方法中这样做。您可以在中找到一些提示。您当然不应该为它使用servletcontext。它已在使用webapplication的所有用户之间共享。谢谢,通过您提供的示例,我修改了我的应用程序,现在它使用相同的bean(会话范围)进行上载和下载,根本不需要与ServletContext混淆。>巴卢斯克:也就是说,这个servlet的目的是什么?你不是想以错误的方式实现一些功能需求吗?”这是一个很好的观点。我使用一个普通的servlet来做图像服务,然后根据BalusC的评论,我意识到bean也可以做得很好,并且更容易与页面集成。@Milo:图像服务又是一个不同的故事。从这里开始:
    if (bean == null) {
        bean = new Bean();
        getServletContext().setAttribute("bean", bean);
    }