从Filter和Servlet中如何访问FacesContext?

从Filter和Servlet中如何访问FacesContext?

(转) 从 Filter和Servlet中如何访问FacesContext?

 

在 Faces realm外,例如 在  filter 或者servlet中,当 FacesContent.getCurrentInstance() 返回null时候,你可以使用FacesContextFactory来得到FacesContext,下面是一个示例.


// You need an inner class to be able to call FacesContext.setCurrentInstance
// since it's a protected method
private abstract static class InnerFacesContext extends FacesContext
{
  protected static void setFacesContextAsCurrentInstance(FacesContext facesContext) {
    FacesContext.setCurrentInstance(facesContext);
  }
}

private FacesContext getFacesContext(ServletRequest request, ServletResponse response) {
  // Try to get it first
  FacesContext facesContext = FacesContext.getCurrentInstance();
  if (facesContext != nullreturn facesContext;

  FacesContextFactory contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
  LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
  Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);

  // Either set a private member servletContext = filterConfig.getServletContext();
  // in you filter init() method or set it here like this:
  // ServletContext servletContext = ((HttpServletRequest)request).getSession().getServletContext();
  // Note that the above line would fail if you are using any other protocol than http

  // Doesn't set this instance as the current instance of FacesContext.getCurrentInstance
  facesContext = contextFactory.getFacesContext(servletContext, request, response, lifecycle);

  // Set using our inner class
  InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);

  // set a new viewRoot, otherwise context.getViewRoot returns null
  UIViewRoot view = facesContext.getApplication().getViewHandler().createView(facesContext, "yourOwnID");
facesContext.setViewRoot(view);

  return facesContext;
}


你可能感兴趣的:(从Filter和Servlet中如何访问FacesContext?)