一个请求中,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 ...
随机推荐
- 简学Python第一章__进入PY的世界
#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...
- css3 3d学习心得
css3 3d学习心得 卡片反转 魔方 banner图 首先我们要学习好css3 3d一定要有一定的立体感 通过这个图片应该清楚的了解到了x轴 y轴 z轴是什么概念了. 首先先给大家看一个小例子: 卡 ...
- mybatis中mapping文件like查询方式
方式1: select * from person where name like "%"#{name}"%" 方式2: select * from perso ...
- MongoDB学习总结(二) —— 基本操作命令(增删改查)
上一篇介绍了MongoDB在Windows平台下的安装,这一篇介绍一下MongoDB的一些基本操作命令. 下面我们直奔主题,用简单的实例依次介绍一下. > 查看所有数据库 (show dbs) ...
- JS打开摄像头并截图上传
直入正题,JS打开摄像头并截图上传至后端的一个完整步骤 1. 打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签 2. 截取图片主要用到canvas绘图,使用dra ...
- FZU 1889 龟兔赛跑
Problem 1889 龟兔赛跑 Accept: 1240 Submit: 1650Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
- VMware虚拟网络连接模式详解(NAT,Bridged,Host-only)
序言 如果你使用VMware安装虚拟机,那么你必定会选择网络连接,那么vmware提供主要的3种网络连接方式,我们该如何抉择呢?他们有什么不同呢?这篇我们就做一个深入. 首先打开虚拟机设置里面的网络适 ...
- [Hadoop] - Hadoop3.0.x编译
这里仅介绍一种Hadoop3.0.x版本的源码编译方式 编译过程 1. 下载源码 2. 安装依赖环境 3. 源码编译 ========================================= ...
- SimpleDateFormat的线程安全问题与解决方案
SimpleDateFormat 是 Java 中一个常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题. 因为 DateFormat 和 Simple ...
- Keepalived + HAProxy 搭建【第一篇】HAProxy 的安装与配置
第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. 安装包 haproxy-1.7.2.tar.gz 第二步:安装 # tar zxvf haproxy ...