JSF请求处理过程(一) FacesServlet初始化

JSF应用中,在web.xml里面配置了一个Servlet,叫做 javax.faces.webapp.FacesServlet,于是可以知道,查看、了解一个请求的处理过程可以从这里开始。从官方网站上下载JSF 的源代码,项目名比较古怪,叫做“mojarra”,我看的版本是1.2_12_b01。里面包含了两个子项目,一个是jsf-api,里面大多是接口以及少量关键类。另外一个项目叫做jsf-ri,对着这个"ri"邪念了半天之后,终于在兄弟提醒之下想明白了是reference implementation的意思。jsf-api是JavaEE标准的一部分,里面的类型包名都是以javax.faces开头的,而jsf-ri项目是sun针对JSF标准的一个参考实现,里面的类型的包名都是以com.sun.faces开头的。

1.FacesServlet初始化(FacesServlet#init)

系统启动的时候,会初始化FacesServlet,调用其中的init方法。里面主要做了两件事情,一个是初始化 FacesContextFactory,另外一个是初始化Lifecycle对象。在jsf-api项目中,FacesServlet类是一个 Servlet接口的实现类,而FacesContextFactory和Lifecycle都是接口。在jsf-ri项目中有这两个接口的实现类,分别是com.sun.faces.context.FacesContextFactoryImpl和 com.sun.faces.lifecycle.LifecycleImpl类。一个想当然的事实:FacesServlet初始化的时候要根据一些配置来判断具体的FacesContextFactory和Lifecycle实现类是什么,也就是在这里,“JSF标准”和“JSF实现”接轨了。想来 MyFaces等等的其他JSF实现应该不外乎两种方式,一种是改变FacesServlet的init方法中需要用到的配置的值,于是启用自己的 FacesContextFactory实现和Lifecycle实现,后面的处理过程就全部走自己的逻辑了。第二种方法笨一点,可能性不大,就是把 FacesServlet覆盖替换掉,其中也不需要读什么配置了,直接使用自己的实现类即可——不过这种做法估计不符合JSF规范,想来只有我等虾米民众能做的出来。主要代码如下:

1 facesContextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
2
3 LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);

回头再来看初始化的结果,FacesContextFactory很明显是用来生产FacesContext这么个东西的。而 FacesContext可以看做是一个RequestWrapper(注意这个FaceContext和ServletContext不一样,ServletContext是一个Web应用只有一个的全局对象,对应的是一个Web application,而一个FacesContext对应的是一个request,另外,RequestWrapper这个说法不严格,实际上 FacesContext里面也包装了ServletContext、Response等)。而LifeCycle可以看做是一个过滤器链(类似于 servlet规范里面的Filter Chain)。于是,整个JSF请求处理过程,实际上就是包装成为FaceContext的用户请求,通过类似于一个Filter Chain的LifeCycle的过程。

时间: 2024-11-16 04:38:29

JSF请求处理过程(一) FacesServlet初始化的相关文章

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

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

IIS5、IIS6、IIS7的ASP.net请求处理过程比较

ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms和 WebServices --这些都在ASP.NET层次结构在最高层. 这篇文章的资料收集整理自各种微软公开的文档,通过比较IIS5.IIS6.IIS7这三代IIS对请求的处理过程,让我们熟悉ASP.NET的底层机制并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解.通过对底层机制的了解,可以让

[转贴]IIS5、IIS6、IIS7的ASP.net 请求处理过程比较

原文:http://blog.joycode.com/ghj/archive/2008/07/25/115200.aspx ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层. 这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟

各版本IIS下ASP.net请求处理过程区别第1/3页_win服务器

绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层. 这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP.NET的底层机制 并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解.通过对底层机制的了解,可以让我们对 ASP.net 有更深的理解. IIS 5 的 ASP.net 请求处理过程 对图的解释: IIS

hadoop-Hadoop2.2.0搭建过程中namenode初始化报错

问题描述 Hadoop2.2.0搭建过程中namenode初始化报错 HDFS初始化namenode报错,求大神帮帮忙!!! FATAL namenode.NameNode: Exception in namenode join java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl cannot be cast to org.w3c.dom.Text at org.ap

详解linux系统的启动过程及系统初始化

一.linux系统的启动流程 关于linux系统的启动流程我们可以按步进行划分为如下: POST加电自检-->BIOS(Boot Sequence)-->加载对应引导上的MBR(bootloader)-->主引导设置加载其BootLoader-->Kernel初始化-->initrd->/etc/init进程加载/etc/inittab,其进程流程图如下:

各版本IIS下ASP.net请求处理过程分析第1/3页_win服务器

绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层. 这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP.NET的底层机制 并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解.通过对底层机制的了解,可以让我们对 ASP.net 有更深的理解. IIS 5 的 ASP.net 请求处理过程 对图的解释: IIS

JSF环境搭建web.xml和faces-config.xml配置

转载:http://www.cnblogs.com/zxpgo/archive/2012/06/29/2570175.html   JSF提供的核心控制器是javax.faces.webapp.FacesServlet. web.xml中的welcome-file-list标签作用:当用户在浏览器中输入的URL不包含某个servlet名或JSP页面时,welcome-file-list元素可指定显示的默认文件. welcome-file子元素用于指定默认文件的名称.welcome-file-li

怀疑论者的JSF: JSF应用程序的生命周期

与很多流行的观点不同,我们无需了解技术工作原理的所有细节,就可以编写 JSF 应用 程序.您只需要给自己设置一个项目,并从头到尾不断修修补补,这样就可以学习到大量的 知识.另一方面,理解必要的基础知识可以使您的开发工作更加有效 -- 而且会节省很多 时间. 在本系列 怀疑论者的 JSF 的第 2 篇文章中,我们将逐一介绍一下 JSF 请求处理生命周 期的 5 个阶段.我们将介绍在每个阶段中会发生什么,以及这些阶段是如何相互连接在一起 的,然后使用一个示例程序来展示实际的生命周期.随着学习的深入,