一个请求中,ADF、JSF究竟做了哪些工作
在Oracle ADF开发中,一个请求发生后,经过ADF处理后,我们可以很快得到响应页面,但在请求过程中ADF框架在背后究竟做了什么东西呢?今天让我们一起来了解下,ADF、JSF是基于组件模型的,不同于请求响应,它的每个组件具有生命周期的概念,在不同的阶段处理、完成不同的任务,理解了这个东西对于日常开发是很有帮助的,我们会清楚地知道代码会在哪个阶段执行,还有当发生异常时,我们可以根据异常快速定位到大概是哪些处理阶段发生问题,从而有针对性地排查处理,不扯那么多了,进入正题。
首先给出JSF和Oracle ADF页面请求处理的生命周期的序列图:

以下对序列图进行说明:
1、 一个http://yourserver/yourapp/faces/some.jsp到达;
2、 ADF的过滤器ADFBindingFilter会找到当前session的绑定容器(BindingContext),如果是用户第一次访问则会进行创建:
- 在BindingContext初始化中,ADF会获取web.xml文件<context-param>的 CpxFileName值,加上.cpx后缀作为绑定上下文数据文件,默认参数是:DataBindings;
- 读取DataBindings.cpx文件以发现数据控制定义,用于在运行时实例化绑定容器的页面定义文件名以及将JSP页面与其页面定义文件相关联的页面映射;
- 构造每个数据控件的一个实例,并引用每个BindingContainer(页面级别),每个绑定容器的内容在第一次被页面使用时被懒惰地加载。
BindingContext:In Brief, Data Bindings file contains the page Map, Page Definition references , References to Data Controls.
3、 接着ADFBindingFilter在参与请求的每个数据控件上调用beginRequest()方法(不同的阶段会有不同的调用方法,生命周期决定的),这样就可以在每个请求开始时通知每个数据控件,从而可以执行必要的设置。
4、 从AM池中获取AM实例;
5、 在JSF的各个标准处理阶段(Lifecycle类,由FacesServlet负责创建),除了完成自己的工作外,顺便通知ADF(ADFPhaseListener类),以便ADF在不同的阶段增加自己的处理内容,毕竟ADF是继承自JSF,肯定需要有自己特色的一些东西的,具体如图所示:

6、 ADFPhaseListener创建一个ADF PageLifecycle对象来处理每个请求,并将不同阶段的处理委托给ADF PageLifecycle类中的相应方法,此过程会创建BindingContainer对象;
7、 JSF转发到响应的页面;
8、 页面上的UI组件访问页面的绑定容器中的值绑定和迭代器绑定,并在浏览器中输出;
9、 ADFBindingFilter在参与请求的每个数据控件上调用endRequest()方法(各司其职),这样可以在每个请求结束时通知每个数据控件,从而可以执行必要的资源清理工作;
10、将应用程序模块的实例释放回应用程序模块池
11、用户在浏览器看到响应页面。
更多文章请见我的个人博客:http://www.acanblog.com
一个请求中,ADF、JSF究竟做了哪些工作的更多相关文章
- jmeter从上一个请求使用正则表达式抓取Set-Cookie值,在下一个请求中运用
工作中遇到的问题,登录请求,返回的Response Headers中有个参数Set-Cookie,需要抓取这个参数,运用到下一个请求中,见下图: 通过正则表达式抓取Set-Cookie的值,由于该值存 ...
- 几种将上一个请求的cookies带入下一个请求中的方法
*** 此次练习不包含使用requests.session()方法实现: 练习环境:本地安装禅道 格式: 1.头部传Cookie:xxx2.加参数cookies=字典格式3.直接传RequestsCo ...
- 一张图带你看懂SpriteKit中Update Loop究竟做了神马!
1首先Scene中只有开始一点时间用来回调其中的update方法 ;] 2然后是Scene中所有动作的模拟 3接下来是上一步完成之后,给你一个机会执行一些代码 4然后是Scene模拟其中的物理世界 5 ...
- postman简单教程,如何在请求中引用上次请求返回的值
做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...
- postman的关联,即如何在请求中引用上次请求返回的值
做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...
- SharePoint REST API - 一个请求批量操作
博客地址:http://blog.csdn.net/FoxDave 本篇主要讲解如何应用$batch查询选项来批量执行REST/OData请求,它将多个操作捆绑到一个请求中,可以改进应用程序的性能 ...
- OpenGL中glRotatef()函数究竟对矩阵做了什么
OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...
- 浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式?
浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式? 存入 IndexdDB 写入 COOKIE 放在 URL 参数 写入 Session 使用 POST ...
- 一个请求在Struts2框架中的处理流程
1.客户端向Servlet容器发起一个请求,将请求封装为HttpServletRequest对象. 2.HttpServletRequest首先经过web.xml中配置的struts2的过滤器,以及s ...
随机推荐
- Modelbuilder快速入门
Modelbuilder快速入门 by 李远祥 什么是modelbuilder 模型构建器是一个用来创建.编辑和管理模型的应用程序.模型是将一系列地理处理工具串联在一起的工作流,它将其中一个工具的输出 ...
- io的四个分类
1.首先是字节操作:InputStream和OutputStream 2.字符操作:Reader和Writer 3.磁盘操作:File 4.网络操作:scoket(不在java.io包)
- jQuery的拾色器
代码如下 1.js <link href="css/farbtastic.css" rel="stylesheet" /> <script t ...
- https post
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- 利用nodejs监控文件变化并使用sftp上传到服务器
很久没写博客了,因为最近在用react+express做一个自己的工具型网站(其实就是夺宝岛抢拍器) 然后因为经常要改动,而且又要放到服务器上进行测试.总是要webpack,然后手动把文件上传上去,不 ...
- Oracle索引语句整理
转载:http://www.cnblogs.com/djcsch2001/articles/1823459.html 索引,索引的建立.修改.删除 索引索引是关系数据库中用于存放每一条记录的一种对象, ...
- 配置NFS服务与tftp服务
在VMware在安装ubuntu的图解 链接:http://pan.baidu.com/s/1jIofvYu 密码:da72 图解里已经解压安装了VMware Tools,接下来必须要安装的就是NFS ...
- 事件详解<一>
一 扭转对事件的认知 事件,是js和html交互的桥梁.当用户操作页面上的元素,比如点击,鼠标移入移出,然后做一些事情. 你若触发,我便执行--事件发生,调用它的处理函数执行相应的JavaScript ...
- List<bean>转换Jsonarray知识心得
使用基本的jdbc连接mysql,获取数据. 创建实体类user: package com.json; public class user { private int id; private Stri ...
- 读书笔记 effective c++ Item 22 将数据成员声明成private
我们首先看一下为什么数据成员不应该是public的,然后我们将会看到应用在public数据成员上的论证同样适用于protected成员.最后够得出结论:数据成员应该是private的. 1. 为什么数 ...