【问题标题】:Accessing FacesContext in servlet在 servlet 中访问 FacesContext
【发布时间】:2012-12-10 15:29:17
【问题描述】:

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

这个委托类将负责提供正确的资源。

例如这是请求的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 项目中执行此操作的最佳方法是什么?

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

能否请您谈谈您对此的看法?

【问题讨论】:

    标签: jsf servlets


    【解决方案1】:

    FacesContext(和ExternalContext)只是facade 上的HttpServletRequestHttpServletResponseHttpSessionServletContext 等以及一些您根本不需要的 JSF 细节在一个普通的 servlet 中。 ExternalContext#getSessionMap() 只不过是HttpSession#get/setAttribute() 的抽象映射。

    在一个普通的 servlet 中,会话仅由 request.getSession() 提供,而应用程序则由 getServletContext() 以通常的方式提供。另请参阅此相关问题:Get JSF managed bean by name in any Servlet related class

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

    【讨论】:

    • 感谢 BalusC 的回复。关于最后一点,你能给我提供一个样本吗?例如,如果有一个获取userInfoFromSession()的代码,最好不要传递任何参数,而是从FacesContext(如果存在)或从HttpServletRequest(使用ThreadLocal)获取Session信息?
    • 嗯,实用方法会被夸大。在 JSF 中它只是 sessionMap.get("user"),而在 servlet 中它只是 session.getAttribute("user")。这些 oneliners 并不完全值得一个通用的辅助方法。
    • 嗨 BalusC,从 Threadlocal 变量中获取当前的 HttpServletRequest 和 HttpServletResponse 是一个好方法吗?我在想的是会有一个通用的方法叫做getUserInfoFromSession(),它会从Session中获取用户的信息。将使用 FacesContext 来获取会话,如果它不存在,我假设它直接来自 servlet,并尝试从 ThreadLocal 变量中获取 HttpServletRequest。你能推荐一下吗?
    猜你喜欢
    • 2014-03-20
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多