我正在开发一个JSF (v1.2)应用程序。在我的应用程序中,我需要一个通用的servlet,可以服务于任何资源(PDF,图像,Excel等)。我的想法是让调用者发送所需的信息,这样我就可以使用一些配置找到正确的委托类。
这个委托类将负责提供正确的资源。
例如这是请求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依赖吗?我可以找到委托方法和类,并使用反射调用它。如果我避免JSF依赖,将来会有任何潜在的限制吗?我能想到的一个问题是,在其中一个代码中,我需要从session中获取用户信息。我通过FacesContext来做这个。由于FacesContext不可用,它将失败,我应该有另一个选项来获得会话。
- 如果我必须引入JSF依赖,我如何获得FacesContext在这里吗?据我所知,只有豆子是储存在里面的应用范围可以在这里访问。我不想那么做。还有别的办法吗? 比起使用servlet,我可以通过调用ManagedBean来实现这一点吗方法直接使用URL?这会给我FacesContext。我我认为我需要一个虚拟的JSP页面来管理bean方法得到调用。
你能告诉我你的想法吗?
FacesContext
(和ExternalContext
)只是HttpServletRequest
, HttpServletResponse
, HttpSession
, ServletContext
等的外观,以及一些在普通servlet中根本不需要的JSF细节。ExternalContext#getSessionMap()
只不过是HttpSession#get/setAttribute()
的抽象映射。
在普通的servlet中,会话仅由request.getSession()
可用,应用程序由getServletContext()
可用。另请参阅其他相关问题:在任何Servlet相关类中按名称获取JSF托管bean。
您还可以将需要由JSF和Servlet共享的代码重构为不依赖于javax.faces.*
或javax.servlet.*
类(或最多只依赖于javax.servlet.*
类)的实用程序方法,并最终让每个调用者传递必要的信息。