在servlet中访问FacesContext

时间:2012-12-24 05:31:04

标签: jsf servlets

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

此委托人类将负责提供正确的资源。

例如,这是请求网址

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依赖,将来是否会有任何潜在的限制。 [我可以考虑的一个问题是,在其中一个代码中,我需要从会话中获取用户信息。我是通过FacesContext这样做的。由于FacesContext不可用,它将失败,我应该有另一个选项来获取会话。
  2. 如果我必须介绍JSF依赖项,我该如何获取FacesContext 这里?据我所知,只有存储在其中的bean 应用范围可以在这里访问。我不想那样做。有没有其他方法可以获得它?
  3. 我可以通过调用ManagedBean来代替使用servlet 方法直接使用URL?这将给我FacesContext。一世 我认为我需要为托管bean方法设置一个虚拟的JSP页面 被调用。
  4. 你能告诉我你对此的想法吗?

1 个答案:

答案 0 :(得分:7)

FacesContext(以及ExternalContext)只是facade而非HttpServletRequestHttpServletResponseHttpSessionServletContext, etcetara以及一些简单的vanilla servlet中根本不需要的JSF细节。 ExternalContext#getSessionMap()只不过是HttpSession#get/setAttribute()的抽象映射。

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

您还可以将需要由JSF和Servlet共享的代码重构为一个实用程序方法,该方法对javax.faces.*javax.servlet.*类没有任何依赖关系(或者最多只有{{1}最后让调用者分别通过必要的信息。