WEB开发网
开发学院软件开发Java JSF请求处理过程(二) 请求处理过程总览(FacesS... 阅读

JSF请求处理过程(二) 请求处理过程总览(FacesServlet#service)

 2009-09-24 00:00:00 来源:WEB开发网   
核心提示:这总览,很明显是看FacesServlet的service方法,JSF请求处理过程(二) 请求处理过程总览(FacesServlet#service),在 FacesServlet的初始化过程中,构造出了全局的FacesContextFactory对象和LifeCycle对象,而不同RenderKit对象是针对不同客户

这总览,很明显是看FacesServlet的service方法。在 FacesServlet的初始化过程中,构造出了全局的FacesContextFactory对象和LifeCycle对象。可以把 FacesContextFactory看做是一个“请求包装工厂”,于是很明显,每当一个请求到达FacesServlet的时候,第一步便是拿着请求,到包装工厂里面包装一下,而包装的结果就是一个FacesContext。代码如下:

1 FacesContext context = facesContextFactory.getFacesContext(servletConfig.getServletContext(), request, response, lifecycle); 

在包装过程中,实际上是创建了一个com.sun.faces.context.FacesContextImpl对象,FacesContextImpl类继承了jsf-api项目中的javax.faces.context.FacesContext。 FacesContextImpl的构造方法的第一个参数是一个叫做ExternalContext的接口的实现,查看其源代码,可以看到 ExternalContextImpl类耦合了Servlet API,而FacesContextImpl与Servlet API无关。实际上,在这里,做到了JSF可以不仅仅使用在Servlet环境中,正如ExternalContext接口的注释中所说,在 Servlet环境中使用JSF和在Portlet环境中使用JSF的不同,实际上就是使用了不同的ExternalContext。在 FacesContextFactoryImpl中构造FacesContextImpl的代码如下:

1 FacesContext ctx = new FacesContextImpl(new ExternalContextImpl((ServletContext) sc,(ServletRequest) request,(ServletResponse) response),lifecycle);

FacesContextImpl的构造方法中,还做了另外一件事情,就是根据配置确定了RenderKitFactory,显然不同的 RenderKitFactory可以产生不同的RenderKit,而不同RenderKit对象是针对不同客户端的,所以对于浏览器、移动设备等等,会有不同的RenderKit。FacesContextImpl的构造方法中代码如下:

1 2 3  下一页

Tags:JSF 请求 处理

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接