EBS OAF 页面的技术剖析(1)

EBS OAF 页面的技术剖析(1)

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)

原文来自于OAF开发文档


这篇文档描述了一个典型的OAF页面的基础组成元素。

内容

l  页面基础

l  模型层

l  界面视图层

l  控制器层

l  Web Bean架构

l  OAF Javadoc向导

 

阅读前的必备知识

如果你是web应用开发初学者,那么轻先阅读“JSP应用入门”章节然后再继续阅读这篇文章。OAF开发向导假设你对JSP 入门中的概念和词汇都是很熟悉的。

页面基础

在浏览器层次上,一个OAF页面就像其它的网页一样,都会生成为标准的HTML页面。

但是在中间层上,这个页面在内存中以Java beans的层级结构来实现的,这里的Java beans很像通常的Java客户端UI。每个在页面上生成的UI 小部件,比如按钮,表格,标签页,应用商标图片等等,都对应于层级结构中的一个或者更多的web beans.

当浏览器对一个新页面发出一个请求时,OAF框架会读取页面声明式的元数据定义来创建web bean层次结构。对于每个关联UI控制器的bean,OAF框架会调用你写的用于初始化页面的代码。当页面出来完成,OAF框架会把web bean的层次结构交给UIX框架,这样它就可以生成HTML页面并发送给浏览器了。

当浏览器发出一个form提交请求时(比如,如果用户选择查询区域的Go按钮),OAF框架会再次创建web bean的层次结构如果有必要的话(这个层次结构会在请求间缓存,并且通常在一些例外情况下需要被重新创建,我们会在后面详细介绍),然后调用你为页面beans所写的事件处理代码。当页面处理完成时,会再次生成HTML页面并发送给浏览器。

这篇文档的剩下部分会介绍特定的模型,界面视图和控制器的代码以及你用于实现一个页面的声明式定义。

图1:OAF MVC 架构的概念图解

EBS OAF 页面的技术剖析(1)_第1张图片

模型层

模型层封装了应用中潜在的数据和业务逻辑.它也为真实世界中的业务对象和它所提供的服务提供了业务抽象。

第三章中的实现模型层文档会更详细的介绍下面的文档。

应用模块(ApplicationModules-AM)

一个BC4J应用模块本质上来说是一个管理和提供对BC4J模型对象访问的容器。在这个语境下,这些对象都是参与同一个任务相关的。比如,所有的组成了一个单独事务的BC4J对象参与了系统的任务—即使相应的用户界面需要用户访问多个页面。

图2:基本的模型架构-Application Module 关系

EBS OAF 页面的技术剖析(1)_第2张图片

所有你创建的应用模块都继承于oracle.apps.fnd.framework.server.OAApplicationModuleImpl类。

每个OAF页面都有一个”根”应用模块,其关联了顶层页面区域(pageLayout区域).根应用模块提供了事务上下文并建立了一个数据连接。

l  如果多个页面参与相同的物理或者虚拟事务,那么它们应该共享相同的根应用模块。

l  如果一个页面功能独立于其它功能,那么它应该拥有它自己的应用模块。

这一章的OA Framework State Management文档详细讨论了根应用模块和不同类型页面的关系。

注意:一个应用模块也可能包含了一个或者多个”嵌套的”应用模块,而且可以随意嵌套不同层次的子应用模块。在这种情况下,根应用模块可以访问所有子应用模块所包含的数据或者对象,并且所有参与同一事物的子应用模块都由根模块建立。当你想创建一个和数据库交互的可重用的UI区域时,你将会用到这个功能。

实体对象(及其关联对象)

BC4J实体对象封装了关联数据库表中一行的业务规则(验证,动作等等)。比如,OAFramework ToolBox Sample Library包含了一个用于存储供应商定义的FWK_TBX_SUPPLIERS表。我们也可以为这个表定义一个实体对象(SupplierEO),其实现了所有的业务规则,比如插入,更新和删除供应商。

注意:实体对象也可以基于视图,同义词或者快照。

OAF框架即支持Java实体对象也支持PL/SQL实体对象(第五章详细讨论了业务涉及和实现,包含JavaVS PL/SQL实体对象的选择建议).

图3:基本的模型架构-实体对象关系

EBS OAF 页面的技术剖析(1)_第3张图片

大多数你创建的实体对象继承于oracle.apps.fnd.framework.server.OAEntityImpl类(稍后你会看到PL/SQL实体对象继承于特定版本的OAEntityImpl类)。

数据库表和实体对象是一对一的映射关系,并且所有的Oracle EBS实体对象一个包含关联的数据库表中的所有列。实体对象在其属性和潜在的数据库列使用声明式映射来自动实现查询,插入,更新和删除。在大多数情况下,你所需要的就是添加验证逻辑。

一个实体对象是为了用于所有需要和给定表交互的程序(不仅仅是OAF客户端)。比如,它应该集成实体对象所有的验证逻辑,这样业务规则总是会被实现不论哪一个客户端使用了它们。

关系对象

如果你有几个复杂的对象(比如一个3个层次的采购订单,其包含了一个在头,行和发运中的一对多的关系),你也可以定通过创建关系对象在相应的实体对象间定义关系。你可以创建弱关联(一个采购订单头”引用”一个供应商,其独立于任何给定的采购订单存在)和强关联(一个采购订单头”拥有”它的订单行,其不能独立于它们的订单头上下文之外)。

视图对象(和视图连接)

用最简单的话来说,BC4J视图对象封装了一个数据库查询。一个查询运行完之后,一个视图对象提供了一个迭代器来访问结果集。结果集包含了一个或者多个视图行,这里视图行由数据库查询返回的行所对应的所有单个属性组成。

图4:基础模型结构—视图对象关系

EBS OAF 页面的技术剖析(1)_第4张图片

你所创建的所有视图对象都继承于oracle.apps.fnd.framework.server.OAViewObjectImpl类。

每个视图对象可配置使用下面其一的策略来查询数据:

l  它的属性映射到一个简单SQL语句中列(通常用于小的,只读的视图对象)。

l  它的属性映射到实体对象属性(用于插入,更新和生成实体对象)

l  一些属性映射到实体对象,一些使用SQL直接设值(使用不能通过实体对象进行查询的临时列来用于增强实体对象数据-专门用于UI显示目的的计算值就是常见的例子)

在OAF应用中,你会在下面这些场景中使用视图对象(它们都会在后面的章节进行全面介绍):

l  为特殊用户界面优化后的数据进行展现。如果用户接口支持实体对象的插入,更新和删除,你将使用视图对象进行交互来执行这些任务。

l  为弹出式列表,值列表和其它支持用的UI组件创建简单的查询。

l  创建高效的可用于业务逻辑中的”验证查询”。比如,在一个采购订单头实体对,你可能要使用一个验证视图对象来从数据库中获取当前最大的订单行号这样就可以缓存它并且当创建新行时可以增加它的值。

最后,你将不仅声明式的来定义视图对象,你将也会写代码来定义视图对象。一个典型的情况就是,代码将为否则查询实现数据绑定并且执行查询(因此一个视图对象知道任何”查询它” 本身)。

视图连接

就像你可以关联实体对象,你也可以创建叫做视图连接的视图对象关系。比如,你可以创建在一个采购订单头视图对象和一个采购订单行视图对象间的视图连接。当访问头时,这个可以在运行时自动查询行。

OADBTransaction

图5:基础模型架构-OADBTransaction

EBS OAF 页面的技术剖析(1)_第5张图片

注意:要完全的精确和兼容,这个图应该包含实现类oracle.apps.fnd.framework.server.OADBTransactionImpl而不是oracle.apps.fnd.framework.OADBTransaction接口,尽管如此,我们选择稍后再包含它因为你只在你的代码中使用这个接口。

就像上面图中展示的,OADBTransaction在你的模型代码扮演了中心角色,因为它封装了关联根应用模块的JDBC连接/数据库会话,并且直接拥有所有你创建的实体对象(你的由根应用模块拥有的视图对象,在他们视图行上持有的是它们实体对象的引用)。你也会在你的模型代码中为下面的通常行为正常使用OADBTransaction:

l  创建一个可调用的语句来执行PL/SQL方法或程序。

l  访问会话级别应用上下文信息比如用户名,ID,当前职责等等。

l  如果你需要进行NLS操作比如把服务器日期/时间转换为用户日期/时间等等,可以访问oracle.apps.fnd.framework.OANLSServices对象。

对OADBTransaction的访问是由根应用模块所提供的。

你可能感兴趣的:(VO,ebs,am,oaf,EO)