JSF应用中在webxml里面配置了一个Servlet叫做javaxfaceswebappFacesServlet于是可以知道查看了解一个请求的处理过程可以从这里开始从官方网站上下载JSF的源代码项目名比较古怪叫做mojarra我看的版本是__b里面包含了两个子项目一个是jsfapi里面大多是接口以及少量关键类另外一个项目叫做jsfri对着这个ri邪念了半天之后终于在兄弟提醒之下想明白了是reference implementation的意思jsfapi是JavaEE标准的一部分里面的类型包名都是以javaxfaces开头的而jsfri项目是sun针对JSF标准的一个参考实现里面的类型的包名都是以comsunfaces开头的
FacesServlet初始化(FacesServlet#init)
系统启动的时候会初始化FacesServlet调用其中的init方法里面主要做了两件事情一个是初始化FacesContextFactory另外一个是初始化Lifecycle对象在jsfapi项目中FacesServlet类是一个Servlet接口的实现类而FacesContextFactory和Lifecycle都是接口在jsfri项目中有这两个接口的实现类分别是ntextFacesContextFactoryImpl和comsunfaceslifecycleLifecycleImpl类一个想当然的事实FacesServlet初始化的时候要根据一些配置来判断具体的FacesContextFactory和Lifecycle实现类是什么也就是在这里JSF标准和JSF实现接轨了想来MyFaces等等的其他JSF实现应该不外乎两种方式一种是改变FacesServlet的init方法中需要用到的配置的值于是启用自己的FacesContextFactory实现和Lifecycle实现后面的处理过程就全部走自己的逻辑了第二种方法笨一点可能性不大就是把FacesServlet覆盖替换掉其中也不需要读什么配置了直接使用自己的实现类即可——不过这种做法估计不符合JSF规范想来只有我等虾米民众能做的出来主要代码如下
facesContextFactory = (FacesContextFactory)FactoryFindergetFactory(FactoryFinderFACES_CONTEXT_FACTORY)
LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFindergetFactory(FactoryFinderLIFECYCLE_FACTORY)
回头再来看初始化的结果FacesContextFactory很明显是用来生产FacesContext这么个东西的而FacesContext可以看做是一个RequestWrapper(注意这个FaceContext和ServletContext不一样ServletContext是一个Web应用只有一个的全局对象对应的是一个Web application而一个FacesContext对应的是一个request另外RequestWrapper这个说法不严格实际上FacesContext里面也包装了ServletContextResponse等)而LifeCycle可以看做是一个过滤器链(类似于servlet规范里面的Filter Chain)于是整个JSF请求处理过程实际上就是包装成为FaceContext的用户请求通过类似于一个Filter Chain的LifeCycle的过程