代码之家  ›  专栏  ›  技术社区  ›  azathoth

从servlet访问jsf managedbean[重复]

  •  10
  • azathoth  · 技术社区  · 16 年前

    我需要知道从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(如中所述 http://balusc.blogspot.com/2006/06/communication-in-jsf.html ):

    import javax.faces.FactoryFinder;
    import javax.faces.component.UIViewRoot;
    import javax.faces.context.FacesContext;
    import javax.faces.context.FacesContextFactory;
    import javax.faces.lifecycle.Lifecycle;
    import javax.faces.lifecycle.LifecycleFactory;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class FacesUtil {
        // Getters -----------------------------------------------------------------------------------
        public static FacesContext getFacesContext(
            HttpServletRequest request, HttpServletResponse response)
        {
            // Get current FacesContext.
            FacesContext facesContext = FacesContext.getCurrentInstance();
            // Check current FacesContext.
            if (facesContext == null) {
                // Create new Lifecycle.
                LifecycleFactory lifecycleFactory = (LifecycleFactory)
                    FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); 
                Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
                // Create new FacesContext.
                FacesContextFactory contextFactory  = (FacesContextFactory)
                    FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
                facesContext = contextFactory.getFacesContext(
                    request.getSession().getServletContext(), request, response, lifecycle);
                // Create new View.
                UIViewRoot view = facesContext.getApplication().getViewHandler().createView(
                    facesContext, "");
                facesContext.setViewRoot(view);                
                // Set current FacesContext.
                FacesContextWrapper.setCurrentInstance(facesContext);
            }
            return facesContext;
        }
        // Helpers -----------------------------------------------------------------------------------
        // Wrap the protected FacesContext.setCurrentInstance() in a inner class.
        private static abstract class FacesContextWrapper extends FacesContext {
            protected static void setCurrentInstance(FacesContext facesContext) {
                FacesContext.setCurrentInstance(facesContext);
            }
        }     
    }
    

    当试图从servlet访问bean时,我总是得到一个空值。
    你有什么建议? 我在Tomcat 6上运行JSF 1.2

    谢谢你的帮助。

    1 回复  |  直到 16 年前
        1
  •  20
  •   BalusC    16 年前

    JSF将应用程序范围的托管bean存储在 ServletContext . 在servlets中, 服务上下文 只是被继承的 getServletContext() 方法。您不需要手动创建一个整体 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的目的是什么?您是否试图以错误的方式实现某些功能需求?

    推荐文章