知识大全 JSF请求处理过程(二) 请求处理过程总览
Posted 知
篇首语:厌伴老儒烹瓠叶,强随举子踏槐花。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JSF请求处理过程(二) 请求处理过程总览相关的知识,希望对你有一定的参考价值。
JSF请求处理过程(二) 请求处理过程总览 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
请求处理过程总览(FacesServlet#service)
这总览 很明显是看FacesServlet的service方法 在FacesServlet的初始化过程中 构造出了全局的FacesContextFactory对象和LifeCycle对象 可以把FacesContextFactory看做是一个 请求包装工厂 于是很明显 每当一个请求到达FacesServlet的时候 第一步便是拿着请求 到包装工厂里面包装一下 而包装的结果就是一个FacesContext 代码如下
FacesContext context = facesContextFactory getFacesContext(servletConfig getServletContext() request response lifecycle)
在包装过程中 实际上是创建了一个ntext FacesContextImpl对象 FacesContextImpl类继承了jsf api项目中的ntext FacesContext FacesContextImpl的构造方法的第一个参数是一个叫做ExternalContext的接口的实现 查看其源代码 可以看到ExternalContextImpl类耦合了Servlet API 而FacesContextImpl与Servlet API无关 实际上 在这里 做到了JSF可以不仅仅使用在Servlet环境中 正如ExternalContext接口的注释中所说 在Servlet环境中使用JSF和在Portlet环境中使用JSF的不同 实际上就是使用了不同的ExternalContext 在FacesContextFactoryImpl中构造FacesContextImpl的代码如下 FacesContext ctx = new FacesContextImpl(new ExternalContextImpl((ServletContext) sc (ServletRequest) request (ServletResponse) response) lifecycle);
FacesContextImpl的构造方法中 还做了另外一件事情 就是根据配置确定了RenderKitFactory 显然不同的RenderKitFactory可以产生不同的RenderKit 而不同RenderKit对象是针对不同客户端的 所以对于浏览器 移动设备等等 会有不同的RenderKit FacesContextImpl的构造方法中代码如下 this externalContext = ec; setCurrentInstance(this); 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中代码如下 lifecycle execute(context); lifecycle render(context);
在LifeCycleImpl这个实现中 存放了一个Phase对象的数组 存放了 个Phase 其中第一个是null 然后依次是视图重建 应用请求值 验证 更新模型值 执行应用程序 呈现响应 在execute方法中 调用了从视图重建开始到执行应用程序为止的 个Phase 而在render方法中 调用了最后一个Phase 也就是呈现响应 在LifeCycleImpl类中 代码如下
//The Phase instance for the render() method private Phase response = new RenderResponsePhase();
// The set of Phase instances that are executed by the execute() method // in order by the ordinal property of each phase private Phase[] phases = null // ANY_PHASE placeholder not a real Phase new RestoreViewPhase() new ApplyRequestValuesPhase() new ProcessValidationsPhase() new UpdateModelValuesPhase() new InvokeApplicationPhase() response ;
在Servlet Filter中 可以由每一个Filter来决定是否要调用下一个Filter 从而决定是否让请求继续通过Filter Chains中的后续Filter 是链式调用的过程 而在LifeCycle的execute方法中 是用一个for循环顺序执行几个Phase 在每一个Phase执行完之后 都会检查FaceContext对象中是否设置了停止后续处理直接呈现响应的标志(renderResponse)或者已经完成了响应无需后续处理也不需要经过呈现响应阶段了(responseComplete) 如果标志为true 那么就不再执行后续Phase
LifeCycleImpl的execute方法主要代码如下 for (int i = len = phases length ; i < len; i++) // Skip ANY_PHASE placeholder if (context getRenderResponse() || context getResponseComplete()) break; phases[i] doPhase(context this listeners listIterator());
在LifeCycle的render方法中 也会检查FacesContext的responseComplete状态 如果为true 那么就不再执行render Phase 于是我们此刻知道了在我们自己所写的一些代码或者JSF库里面的一些代码中 调用FacesContext的responseComplete方法和renderResponse得作用原理 render方法主要代码如下 if (!context getResponseComplete()) response doPhase(context this listeners listIterator());另外注意 Phase这个概念 接口 以及几个实现 都是jsf ri项目中的 而在jsf api中不存在Phase这个概念 所以 LifeCycle是JSF标准的内容 而通过几个Phase来处理请求这种实现是sun的参考实现的做法
cha138/Article/program/Java/hx/201311/25717相关参考
五步解释Struts处理请求的过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb
知识大全 比较IIS5、IIS6、IIS7的ASP.net请求处理过程
比较IIS5、IIS6、IIS7的ASP.net请求处理过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
/_struts分发请求的过程与相关配置 按照mvc模式设计出的web层框架其实就是一个大大的servlet 我们可以在webxml文件中将符合某种特征所有请求交给这个Servlet处理
对请求进行处理的元素主要有interceptorsAction以及Result下面分别对其进行讲述 .拦截器配置(interceptors) 通过使用拦截器我们可以在action中的方法执行之
.NET处理xmlHttp发送异步请求 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近正在拜
PHPWeb开发学习实录:处理GET和POST请求方法问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
Web请求异步处理降低应用依赖风险 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问题凸现&nb
Struts2请求处理流程及源码分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Struts
ASP.NETRouting对请求的处理方式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先
ASP.NETRouting对请求的处理方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先