Jsf 在servlet中访问FacesContext

Jsf 在servlet中访问FacesContext,jsf,servlets,Jsf,Servlets,我正在开发一个JSF(v1.2)应用程序。在我的应用程序中,我需要一个通用servlet,它可以服务于任何资源(PDF、图像、Excel等)。我的想法是让调用方发送所需的信息,这样我就可以使用一些配置找到正确的delegator类 这个delegator类将负责提供正确的资源 例如,这是请求url http://example.com/servlet?delegatorid=abcd 我的Servlet代码是这样的 protected void doGet(HttpServletRequest

我正在开发一个JSF(v1.2)应用程序。在我的应用程序中,我需要一个通用servlet,它可以服务于任何资源(PDF、图像、Excel等)。我的想法是让调用方发送所需的信息,这样我就可以使用一些配置找到正确的delegator类

这个delegator类将负责提供正确的资源

例如,这是请求url

http://example.com/servlet?delegatorid=abcd
我的Servlet代码是这样的

protected void doGet(HttpServletRequest request, HttpServletResponse response){
 String delegatorID=request.getParameter("delegatorid");
//Get the configuration from Configuration table
configuration=getConfiguration(delegatorID);
//invoke the method of the delegator class based on this configuration
Object result=invokeMethod(configuration);
//write the response to the stream
}
我的问题是在JSF项目中实现这一点的最佳方式是什么

  • 我应该在这个操作中完全避免JSF依赖吗?我可以找到delegator方法和类,并使用反射调用它。如果我避免JSF依赖,将来会有任何潜在的限制吗。[我可以考虑的一个问题是,在其中一个代码中,我需要从会话中获取用户信息。我通过FacesContext进行此操作。由于FacesContext不可用,它将失败,我应该有另一个选项来获取会话
  • 如果必须引入JSF依赖关系,如何获得FacesContext 这里?据我所知,只有储存在 可以在这里访问应用程序范围。我不想这样做。有其他方法获得它吗
  • 我可以通过调用ManagedBean来代替使用servlet吗 方法直接使用URL?这将给我FacesContext.I 我想我需要一个虚拟JSP页面,以便托管bean方法 被调用

  • 您能告诉我您对此的想法吗?

    面部上下文(和
    外部上下文
    )只是一个简单的servlet请求、
    HttpServletResponse、
    HttpSession、
    ServletContext、
    ServletContext等等,以及一些在普通servlet中根本不需要的JSF细节
    不过是
    HttpSession#get/setAttribute()
    的抽象映射

    在普通servlet中,会话仅通过
    request.getSession()
    可用,应用程序通过
    getServletContext()
    以通常的方式可用。另请参见此相关问题:


    您还可以将需要由JSF和Servlet共享的代码重构为一个实用方法,该方法不依赖于
    javax.faces.*
    javax.Servlet.*
    类(或者最多只依赖于
    javax.Servlet.
    )最后让每个呼叫者传递必要的信息。

    感谢BalusC的回复。关于最后一点,您能为我提供一个示例吗?例如,如果有一个代码获取userInfoFromSession(),最好不要传递任何参数,而是从FacesContext(如果存在)或HttpServletRequest(使用ThreadLocal)获取会话信息?好吧,实用方法会被夸大。在JSF中,它只是
    sessionMap.get(“user”)
    ,而在servlet中,它只是
    Session.getAttribute(“user”)
    。那些OneLiner不值得一个通用的助手方法。嗨,BalusC,从Threadlocal变量获取当前的HttpServletRequest和HttpServletResponse是一个好方法吗?我想会有一个名为getUserInfoFromSession()的通用方法,它将从会话中获取用户的信息。将使用FacesContext获取会话,如果它不存在,我假设它直接来自servlet,并尝试从ThreadLocal变量获取HttpServletRequest。您能建议吗?