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 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的过程。

JSF请求处理过程(一) FacesServlet初始化相关推荐

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

    JSF请求处理过程(二)请求处理过程总览(FacesServlet#service) 更新日期:2009-07-20 点击:这总览,很明显是看FacesServlet的service方法.在Faces ...

  2. JSF 源代码赏析之FacesServlet

    学习JSF 多日,现在开始看看源代码. 首先是FacesServlet类了,作为一个前端控制器,每一个JSF请求都要通过FacesServlet,然后再到其他阶段,那么,FacesServlet 到底 ...

  3. struts2请求处理过程源代码分析(1)

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:http://www.see-source.com/ 源码解析网 网上对于struts2请求处理流程的讲解还是比较多的 ...

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

    IIS5.IIS6.IIS7的ASP.net 请求处理过程比较  这篇文章是收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP ...

  5. IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)

    http://www.sina.com.cn 2008年07月30日 16:04 <程序员> ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来 ...

  6. springmvc 的请求处理过程(精编)

    springmvc 的请求处理过程(精编) 1. DispacherServlet 前端控制器接受发送过来的请求,交给HandlerMapping 处理映射器, 2. HandlerMapping 处 ...

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

    http://blog.csdn.net/dz45693/archive/2009/12/17/5027882.aspx ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力 ...

  8. IIS 相关概念(站点、虚拟目录、应用程序池、隔离模式、W3WP.EXE、Web Gargen) 及 IIS 6的ASP.net请求处理过程

    基本概念: 1. 站点程序:在IIS中我们所新建的站点,可以为其配置ASP.net以及应用程序池的版本. 2. 虚拟目录:用来将不同的文件夹中的内容通过虚拟目录组织到同一个文件夹中,相当于一个应用程序 ...

  9. Janus源码分析(3)——请求处理过程

    1. Janus启动及线程 Created with Raphaël 2.2.0开始......启动Session处理线程启动请求处理线程创建异步请求处理线程池......结束 1.1 线程处理代码 ...

最新文章

  1. 《Adobe Premiere Pro CS5经典教程》——2.9 用Media Browser查找素材
  2. MySQL几个特别语法示例
  3. PHP中Header函数和PHP_AUTH_USER做用户验证
  4. OpenUDID 是否足够替代 UDID 使用?有何不同?
  5. 设计模式 原型模式_原型设计模式:创建另一个小车
  6. linux串口数据异常,linux串口知识深入--收到数据异常问题处理
  7. python 神经网络原理_神经网络理论基础及Python实现
  8. 推荐引擎内部的秘密3
  9. webpack----entry
  10. sha 2 java加密_java中的SHA2密码哈希
  11. 网站运营之比较和差异化
  12. 修改 Ubuntu SSH 登录后的欢迎信息
  13. [Angular2 Animation] Control Undefined Angular 2 States with void State
  14. 小米Android 4.3.1刷机包,终于来了:小米4 Win10刷机包下载!附刷机教程
  15. ie浏览器升级的正确姿势
  16. linux如何卸载anaconda
  17. kingroot android 8.1,360一键root手机版
  18. 英语的句号在c语言中是什么意思,英语标点符号的用法
  19. Mac电脑DisplayPort/HDMI连接显示器后没声音
  20. UWB定位的3种算法:TWR、TOA和TDOA算法

热门文章

  1. (数据库系统概论|王珊)第九章关系查询处理和关系优化-第三节:查询优化之代数优化
  2. (软件工程复习核心重点)第八章面向对象方法学-第四节:面向对象建模之动态模型和功能模型
  3. 9-4:C++多态之单继承和多继承中的虚函数表
  4. linux shell if -a 到-z参数含义
  5. centos7 centos-home 磁盘空间转移至centos-root下(磁盘空间不足,磁盘不足)
  6. Thinkphp V5.X 远程代码执行漏洞 - POC(精:集群5.0*、5.1*、5.2*)
  7. Ubuntu搭建安装svn
  8. Unix domain socket 简介(进程间通信,进程通信)
  9. iOS CGRectGetMaxX/Y 使用
  10. C# ASP.NET MVC 配置允许跨域访问