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

这总览,很明显是看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 this.externalContext = ec;
2 setCurrentInstance(this);
3 this.rkFactory = (RenderKitFactory)FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);

在代码中我们经常使用FacesContext.getCurrentInstance()这个静态方法来获取与当前请求对应的 FacesContext对象,实际上是在FacesContext类里面有一个静态的ThreadLocal对象用来存放了当前请求线程对应的 FacesContext对象,于是上面的代码中setCurrentInstance(this)就是把当前构造出来的这个FacesContext对象放到了ThreadLocal里面。

FacesContext创建出来以后,正如上面所说,要让他经过LifeCycle这个“Filter Chain”的逐步处理了。那么,Filter Chain里面放的是一个一个Filter,那么LifeCycle这个Chain里面放的是什么呢?答案是Phases。

FacesServlet让FaceContext通过LifeCycle的处理,分成了两个部分。一个部分是调用LifeCycle的 execute方法,执行逻辑,第二个部分是调用LifeCycle的render方法,呈现响应。FacesServlet.service中代码如下:

1 lifecycle.execute(context);
2 lifecycle.render(context);

时间: 2024-09-14 01:37:57

JSF请求处理过程(二) 请求处理过程总览(FacesServlet#service)的相关文章

上传图片-图片上传过程和下载过程的问题

问题描述 图片上传过程和下载过程的问题 从客户端上传图片给服务器这个过程中图片是被压缩后上传还是直接原图?一般从服务器下载的图片会比当初自己上传的照片小很多这个是不是在下载的过程中被处理了还是说服务器里面存的照片只有这么大? 非常感谢 解决方案 如果不怕浪费带宽和无所谓服务器的性能和存储,服务器提供下载100MB的图片也可以的. 解决方案二: 一般是网站在得到上传文件的时候会进行处理,比如裁剪和缩放控制分辨率.或者转换成统一的格式,比如png/jpg等. 解决方案三: 上传一般是原图上传,没有原

WCF Data Service使用总结(二) 使用WCF Data Service 创建OData服务

在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主要说明在.NET的环境下,如何使用 WCF Data Service 来创建OData服务.当然,对于 JAVA 或者其它平台,也是可以创建 OData 服务的.甚至是数据库,都可以提供 OData 服务. WCF Data Service 是需要 ORM 的支持的,当然,主流的 ORM 都已经支持 WCF Data Service 了,包括(但不限于)

KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程

   接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从guest vm跳转到kvm和qemu后的处理过程.     首先回顾一下kvm的启动过程(http://blog.csdn.net/dashulu/article/details/17074675).qemu通过调用kvm提供的一系列接口来启动kvm. qemu的入口为vl.c中的main函数,m

SQL Server 2008 RC0安装过程二:安装准备

选择SQL Server 2008 RC0安装中心的"安装"选项,然后选择安装独立实例,就可以启动SQL Server 2008 RC0的安装过程了. 安装程序首先会执行一些安装需求检查,包括操作系统版本.安装权限等,可以通过"Show details"按钮来了解各项的检查结果.如果有检查条目没有通过的话,可以通过"Status"列来了解该条目的详细检查结果. 检查通过后,用户就需要选择安装版本了,如果没有相应的序列号就只能选择评估版,如果有序列

OO 设计过程(二):开始设计软件(---问题定义---)

1. OO 需求搜集   因为"需求搜集"通常包含一些关于需求是什么以及您如何去搜集它等方面的不正确的假定(至少从 OO 角度)   首要任务是解决必须做什么,而不是如何去做   --------在 OO 说法中,问题定义的第一步称为正规问题说明书----------------2. 问题说明书   在任何一个设计中,精确地陈述问题总是第一步的.这里,您的目标是要简洁而精确地说明书您所要解决的问题.再次重申,您的注意力应在做什么和为什么做,而不是如何做.   解有关该问题领域方面的知识

通过错误的sql来测试推理sql的解析过程(二)

 之前总结过一篇  通过错误的sql来测试推理sql的解析过程 http://blog.itpub.net/23718752/viewspace-1848816/ 也算是以毒攻毒,当然也分析出来一些有意思的内容来,让原本看起来枯燥的内容有了更多的实践意义. 在后来小组内部做了一个分享总结,本来以为已经总结差不多了,但是发现真是集思广益,大家临时想出不少好的点子来,这也就是brainstroming的好处吧. 比如下面的错误sql,在解析的时候,会首先报错在group by的部分.在10g和11g

memcached实战系列(七)理解Memcached的数据过期方式、新建过程、查找过程

1.1.1. 新建Item分配内存过程 1:快速定位slab classid,先计算Item长度 key键长+flag+suffix(16字节)+value值长+结构大小(32字节),如90byte 如果>1MB,无法存储丢弃 取最小冗余的slab class 如:有48,96,120,存90会选择96   1.1.2. 按顺序寻找可用chunk顺序 (1)slot:检查slab回收空间slot里是否有剩余chunk delete:delete时标记到slot exptime:get时检查的过期

Windows Azure AppFabric 入门教学系列 (二):一个简单的Service Bus例子

本文是Windows Azure AppFabric入门教学的第二篇文章,可以说是正式的开始学习AppFabric了.为了使后续的学习顺利进行请确保已浏览本教程的第一篇文章,并以按照该文完成了AppFabric项目和命名空间的创建.我们知道,AppFabirc由Service Bus 和 Access Control Service组成.本篇教学以一个简单的Echo程序来向大家简单的介绍一下Service Bus,让大家能有一个初步了解. 该程序演示了Client向Service发送消息,ser

asp中过程、函数的相似与区别

在VBscript中,过程与函数都是指一组能执行特定功能的代码块,当我们定义了自己的过程或函数后,就可以在脚本中反复调用它们,对于自定义的过程或函数还可以放在外部的文件夹中,使用#include指令调用它们.         在VBscript中,过程与函数都是指一组能执行特定功能的代码块,当我们定义了自己的过程或函数后,就可以在脚本中反复调用它们,对于自定义的过程或函数还可以放在外部的文件夹中,使用#include指令调用它们. 一.定义:       定义过程格式:      Sub 过程名