在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究竟做了哪些工作的更多相关文章

  1. jmeter从上一个请求使用正则表达式抓取Set-Cookie值,在下一个请求中运用

    工作中遇到的问题,登录请求,返回的Response Headers中有个参数Set-Cookie,需要抓取这个参数,运用到下一个请求中,见下图: 通过正则表达式抓取Set-Cookie的值,由于该值存 ...

  2. 几种将上一个请求的cookies带入下一个请求中的方法

    *** 此次练习不包含使用requests.session()方法实现: 练习环境:本地安装禅道 格式: 1.头部传Cookie:xxx2.加参数cookies=字典格式3.直接传RequestsCo ...

  3. 一张图带你看懂SpriteKit中Update Loop究竟做了神马!

    1首先Scene中只有开始一点时间用来回调其中的update方法 ;] 2然后是Scene中所有动作的模拟 3接下来是上一步完成之后,给你一个机会执行一些代码 4然后是Scene模拟其中的物理世界 5 ...

  4. postman简单教程,如何在请求中引用上次请求返回的值

    做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...

  5. postman的关联,即如何在请求中引用上次请求返回的值

    做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...

  6. SharePoint REST API - 一个请求批量操作

    博客地址:http://blog.csdn.net/FoxDave 本篇主要讲解如何应用$batch查询选项来批量执行REST/OData请求,它将多个操作捆绑到一个请求中,可以改进应用程序的性能 ...

  7. OpenGL中glRotatef()函数究竟对矩阵做了什么

    OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...

  8. 浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式?

    浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式? 存入 IndexdDB 写入 COOKIE 放在 URL 参数 写入 Session 使用 POST ...

  9. 一个请求在Struts2框架中的处理流程

    1.客户端向Servlet容器发起一个请求,将请求封装为HttpServletRequest对象. 2.HttpServletRequest首先经过web.xml中配置的struts2的过滤器,以及s ...

随机推荐

  1. std::list 源代码解析

    首先声明,下面的讲解都是针对GCC2.9,std::alloc 通过下面的源代码大家可以看到list类的内部成员是一个node,而他的类型是linktype,前面的typedef里面有介绍是一个指针, ...

  2. nginx配合IIS实现简单负载均衡

    1.IIS 部署两个站点端口分别为8081和8082 8081站点和8082站点如下[随便写了个没有样式的很丑的页面],我特意加了111和222区分     2.设置nginx配置文件,实现简单的负载 ...

  3. Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建

    maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...

  4. js加密

    在项目中,经常需要使用加密来保障数据的安全性,虽然可以通过在后台加密再传给前台,但这样无疑会增加后台的服务器的压力.所以在js中使用加密算法也就应运而生了. 一.base64加密 需要引入base64 ...

  5. Memcached服务安装

    安装Memcached服务 memcache分为服务端和客户端程序 服务端程序用来支持存储k-v值,程序名称memcached 客户端与服务端通信,进行存取值(常用的如php的memcache扩展,m ...

  6. ABP Zero源码

    测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin  密码:123456 需要源码,请加QQ:858-048-581 1.先编译成功,Nuget下载ABP的依 ...

  7. mybatis系列笔记(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

  8. MySQL优化二(连接优化和缓存优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  9. Linux tomcat部署War包,Linux在Tomcat部署JavaWeb项目,Linux部署War包

    Linux tomcat部署War包,Linux在Tomcat部署JavaWeb项目,Linux部署War包 >>>>>>>>>>>& ...

  10. php 实现简单购物车

    今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...