OAF_OAF Framework状态分析(概念)

20150706 Created By BaoXinjian

图片 11. 搭概述


搭概述

生图显示了着力的OAF状态管理组件的施用开发视图(它并从未体现所有的OAF细节)。

 
图片 22.
Root Application
Module(数据库会话和业务状态)


每当OAF页面中,每个页面都关乎到一个root
application
module,提供了业务及下文和JDBC数据库连接(在OAF中,数据库会话是事关到JDBC连接的)。

Root application
module是OAF的命脉module,因为基本的行使数据(视图对象、实体对象等)和页面的WEB
BEAN结构都活动为它(oracle.apps.fnd.framework.OADBTransaction)缓存。

警告:使用后降落按钮可能要APPLICATION
MODULE状态丢失。在编写代码之前要参见“支持后回落按钮”。

有在于事情中之数目对于有着共享这同样ROOT
APPLICATION MODULE实例的页面还是可看的。

OAF提供了你得据此来起作业中存储、取出、删除数据的艺术。一个简便的业务可以为控制器和模型中的代码访问,这些家伙是以oracle.apps.fnd.framework.webui.OAPageContext(对于控制器)和OADBTransaction(对于范)中提供的。

 

  1. 保持ROOT APPLICATION MODULE

默认情况下,当用户从一个页面转至任何一个页面时(如一个GET请求或一个JSP
FORWARD),OAF生成一个初页面,前一个页面的application
module被放,一个新的实例从applicaiotn module池中生成。

注意:OAF从不会自由于POST请求提交的application
module(除非您手工释放)。如:如果用户对一个报表排序或于报表中跳转(两独在后台提交form的动作)页面的application
module实例自动为保障。

 

  1. 保页面间的APPLICATION MODULE

地方所说之情切合给独立的、完整的职责。但对于由于多页面组成的一个任务或多独涉页面并用一个作业的情景,不同的页面就务须关联到一个ROOT
APPLICATION实例。

及以上之景象,你得得:

(1).  在多页面中也每个页面指定同一个root
application module。

(2).
通过点名URL参数retainAM=Y来设置application module retention标记。

对GET请求,这个符号是当初页面显示的早晚被拍卖的(如上面所涉的,OAF总是为POST请求保持和一个application
module,而不管retainAM参数)。

要设为Y,前一个页面的application
module会被保留,如果设为N(或者不设,视同为N),OAF会释放具有的application
module,包括先那些显式声明也保留的

乃吧足以以JSP FORWARD
的OAPageContext时设置这个参数。

告诫:只以不同之页面关联和一个root
application
module是不够的。如果你忘记了装retainAM标志,每个页面会下不同之application
module实例和工作,即使其关联到了跟一个application module 类型。

小心:典型气象下,根据application
module池的状态,页面B 不能够得物理上的页面A的application
module。但是,对象的状态会完全重置就如建立一个初的如出一辙。你可认为他是一个新的实例。

相同的,如果您设置了retainAM标志吗Y,但是并未用大半只页面关联到与一个application
module,你的大多单页面吗会见采用不同之application module和事情。

 

  1. 有格的保留/释放application
    module

当有些状况下,你可能用控制是否要封存或放一个application
module。

汝可以呢不同的application
module实现oracle.apps.fnd.framework.webui.OAReleaseListener接口。

警示:开发团队尚未收获提拔之前,不应当用是接口。不得法的使这个接口会造成内存泄漏。

 

  1. 显式释放application moudule

偶然你吧会见怀念显式的放走一个root
application
module,特别地,你当页面控制器中调用OAPageContext.releaseApplicationModule()方法,

OAF将会一如既往完成页面显示就释放页面的root
application module,而不用等下一个application module请求。

 
图片 33. Root Application Module保留用例


下表描述了applicatoin
module保留或放的提议

图片 4

 

图片 54.
Servlet Session


如以JSP基础中涉嫌的,一个servlet
session是于同多元HTTP请求的连续动作过程被以浏览器与服务器之间保持状态的之建制。

一个session可能以随意时候被应用服务器建立或者通过利用、用户关闭浏览器、用户过来已。一个session通常对应于一个签到/退出过程,但是于OAF中连无是一心如此。

汝可以当servlet
session中缓存一个小的可保存之对象(OAF中得是字符串、数字、日期),同一个session中其他页面还可以看缓存中之数目。如:如果你道从数据库中读取用户信息极耗费资源了,你可动用此措施

只顾:只有当您要以不同root application
module的多独页面中做客一个简单易行值的当儿才要用session缓存。

君必牢记servlet
session数据是绝非叫消除的(当SESSION激活的时节)必须为出示的破。这样的话,如果用户并未离而是简单的暂停了,因为没再好之事件来释放内存,故session是最终一个精选。

唤醒:有更的JSP开发者可以会疑惑为什么不用隐藏域,根据OAF当前之菜系实现方式(一些食谱发送GET请求而不是POST请求),所以当您挑一个菜系里,不容许连续朝请求中上加值。

如果要以SERVLET
SESSION中蕴藏、接收、删除值,查看OAPageContext
put*(),get*()和remove8()方法。

 

图片 65. Oracle用用户Session


当用户登录到OAF中时常,OAF建立一个AOL/J
oracle.apps.fnd.common.WebAppsContext对象及因SESSION的cookie,一起保持利用的上下文信息,如当前任务、组织ID和用户信息相当。

1.
Cookie封存了session中之加密的要紧信息,这是数据库中之一行数(特别的,这是一个servlet
session id,在早就解密的form中,是以ICX_SESSIONS表中的主键)

2.
WebAppsContext从每个请求被接受键值,使用它们来询问时之session状态。

  1. 用户session关联到一个servlet
    session,但它们发出和好之生命周期和过期特性。

(1). 一般情形下,用户session应该比servlet
session生命周期更丰富。

(2). 一个用户session可能涉嫌到几近单servlet
session(如果,如:当用户以树一个时光非常丰富之表格过程中,servlet
session超时了,然后还好于用户session超时前继续工作)。

(3). 一个servlet
session可能波及到差不多独用户session(如:一个用户退,没有停歇窗口又晚下降)。

4.
比方用户session超时了,用户为远非关浏览器窗口(基于session的cookie也没有少),也没有丁去ICX_SESSIONS表的呼应记录,用户就可当登录后由上次已的地方连续工作。

倘你待拜访用户session中之数据,你可OAPageContext(在控制器代码中)或者OADBTransaction(在模型代码中)。

 

图片 76. 用到及下文


当不可知顾OAPageContext时,你啊得采用下上下文来存储状态(在JAVA
服务器层或者PLSQL代码中)。这样的话,你可以动用WebAppsContext.setSessionArribute(name,value)方法。

 

图片 87. 页面上下文


历次收到至一个页面的请,OAF都建一个OAPageContext存储信息,直到新的页面就(特别的,OAPageBean建立OAPageContext,它根本是在页面后高由做作)

 

图片 98.
告和页面边界


一个WEB应用之办事单元是有的请求/响应,浏览器发送请求,servlet处理者要并回到一个应,响应的传递意味着一个告的终结,或者是一个请求的成就及新的乞求之前的交界。

一如既往,当OAPageBean完成页面的拍卖,这吗是时下页面和新页面中的分界。

故此,一个用户从页面X跳反至页面A,又过反到页面B,这时我们有少数只请求边界:X和A之间,A和B之间。也生零星单页面边界:X和A,A和B。

稍加情况下,请求与页面的疆界不等同,考虑以下情形:

用户从X到A

于A的时节,在响应决定显示谁页面之前,用户挑选了A的控件,所以,浏览器发送了一个央到A,当A处理完毕,就上了第一独页的边际。

于页面A的代码中,开发者估算用户选择了谁控件发送JSP
FORWARD到页面B,因为我们无思再度显示A,所以不用反回HTTP响应,OAF开始拍卖页面B(包括成立一个新的OAPageContext),一旦B处理完成,就达了次独页面边界。

因为页面B必须出示为用户,故一个HTTP响应发送到浏览器,就到了请求的界线。

据悉以下的故,明白这或多或少凡大关键的

1.
告参数是于要的生命周期中,它可以超过多只页面的界限。这对于那些当一个求与一个页面相同的开发者来说有些奇怪,在JSP
FORWARD后呢不用说明求参数还在。如以下示例:

(1).
用户挑选了页面X中之连,转至页面A,页面A的URL包括参数foo=bar

(2).
页面A发送一个及页面B的JSP
FORWARD,现在即令我们是在一个初的页面被,请求被仍然包括foo=bar

(3).
 如果你无思量当jsp
forward后尚连参数,你必显式的挂其(注意你切莫克由呼吁被去除参数),如当您调用OAPageContext的setForward方法时您得重置参数,foo=X

提拔:将未待之参数设为一个新值更可取,不要简单地用其使为“”。

2.
缘于页面上下文与请之前从未一对一的涉,对于自OAPageContext中走访请求参数,有人会感觉纳闷。只要记得每个页面是一个明显的实体,从她的“显示点”OAPageContext表示了一个告。

3.
当你进去及图的底细时,你会相页面及请求的境界是显眼的发出异含义的钝化事件点。

 

图片 109.
请求


尽管是生命周期很短缺,每个HTTP请求或建立一个目标。这个目标包括以下应用状态:

所有的URL参数,不管是POST还是GET。

假设是POST请求,包括FORM中的多寡。

倘是POST请求,web
bean和事件名称会波及到用户选择的控件(如用户挑选了一个GO按钮,请求会席卷为这按钮命名的web
bean,所以你可以了解它叫按下了连是做出响应)。

为了看请求值,使用OAPageContext的getParameter*()方法。

 

图片 1110.
使用隐藏域


一个隐藏域是开发者在FORM中读取或摹写副数据工具,它不可知被用户访问。如同用户观看的FORM域一样,隐藏域也于交时给加至了请中。

而可透过在Jdeveoper中挑选item
style的formValue建立一个隐藏域。在运作时,它为oracle.apps.fnd.framework.webui.beans.form.OAFormValueBean来初始化。

 

图片 1211.
当JSP FORWARD和重定向时指定值


当你显式的行使OAPageContext
setForward*()或者OAPageContext.sendRedirct()方法转至一个初的页面时,你可设定请求参数。

例如:假定有一个页面包括一个交按钮,当用户点击时,我们想用JSP
FORWARD转到B页面。页面A用同传递一个mode值给页面B(可以由不同的方法来走访),所以它知道怎样做

  1. 用户点击提交按钮。

2.
在页面A的控制器中处理这按钮,在processFormRequest方法被调用OAPageContext.setForwardURL()。做也一个方法调用,设定参数queryMode=automatic。

3.
于页面B的控制器中,在processRequest方法被检查参数queryMode值,调用getParameter(“queryMode”)。

4.
页面B控制器于是响应queryMode参数值为automatic,查询数据来展示页面。

 

**图片 1312.
调用OAPageContext.putParameter()指定值
**


OAPageContext包括putParameter()方法,在页面处理过程中,你得据此来传递值到web
bean结构面临,或者利用jsp forward从一个页面传到下一个页面。

假如:一个顶层的region可能停一个价到缓存中,它的子region可以引用。

提示:这个和JAVA SERVLET
2.1的HttpServletRequest.setAttibute()方法充分相像,可以当其做所以同。

 

图片 1411.
设定URL参数


当在Jdeveloper中定义URL时若可指定要参数,或者在相关的先后中安装URL。

提个醒:URL是有长限制的,你应该小心的添加URL参数的多少,尤其是非常丰富之早晚。因为URL是可见的,你应有加密敏感的值,然后再解密。

 

图片 1512. 态钝化模型(“Passivation”)


OAF是工作导向的,许多作业都超了大半独页面。这些工作需要自然之状态来保存信息直到用户就任务。如:一个树市定单的之流程中,用户在第一页描述定单,在次页输入一个还是多个类型,在第三页提交前检查信息,这个请定单数据以每个浏览器提交的请求中要吃保留。

HTTP协议是不管状态的,它不克保存任何指定的状态呢不保险支持状态保存。而且,如果提供servlet
session的JVM实例失败了,或者servlet
session超时了,应用状态就不见了,等待的事务也无能够回升。

OAF,从单来讲,当用户工作经常,合并了保留及回复客户端状态的能力,即使是servlet
session超时(以后的版本会提供JVM失败的支撑)。

1.
保留应用状态及外一个地方(在OAF中,是保留于数据库被)叫做钝化。

2.
打另地方恢复使用状态叫做活化。

特意的,OAF目前供了以下的状态管理特点:

可变的行使,当资源消耗大高时,OAF保存空闲线程的状态,并拿其的资源重新分配给任何线程,而无是新建一个资源实例。当空闲之线程激活时,保存的状态被还原。简单说,资源会在JDBC连接、application
modules、用户session中重新分配。

Servlet session 超时回升,servlet
session会超时,而非用用户更开始一个免到位的业务(将来这个特点会扩大及资中间层的挫败支持)。

 

图片 1613. Application Module
缓冲池


为了增进性能与可变性,OAF缓冲了APPLICATION
MODULE,重用是比例建还管用的法子。在简易的气象下:

  1. 每个JVM都发生一个application
    module池管理器,里面含有和治本差之application module池。

  2. 每个application
    module池包含了有的application module的实例,

苟,如果一个使使用了片只root
application module,就闹半点独application module池:

oracle.apps.fnd.framework.toolbox.tutorial.server.Lession3AM和oracle.apps.fnd.framework.toolbox.tutorial.server.Lession4AM,

一般来说图。换句话说,每个root application
module都建立一个塘。

  1. 当池中的application
    module实例被设计成可用的还是未可用之(当前叫提走的)。

  2. 仅发root application
    module是放在池中之,嵌套的application module是于root application
    module缓冲的。

Thanks and Regards

参考:红豆加奶 –
http://shaofeng.blog.51cto.com/3392077/655672

图片 17

相关文章