页面基础

在浏览器层,OAF页面和其它页面一样,是标准的HTML页面。

在中间层,OAF页面实际是由内存中的JAVABEAN结构来实现的,和传统的JAVA客户端界面相同。每个页面中的用户界面(UI)组件(按钮、标签、图片等)实际都对应一个或多个结构中的JAVABEAN

当浏览器请求一个新页面时,OAF读取页面中的声明的元数据来建立WEB BEAN的结构。对每一个带有UI控制器的BEANOAF调用你写的代码来初始化页面。当页面执行完毕,OAFWEBBEAN结构交给UIX框架来处理,它能将之转为HTML发送到浏览器。

当浏览器提交一个FORM(如:用户选择了搜索区的GO按钮),如有必要,OAF重新建立WEBBEAN结构(BEAN结构在请求之间是缓存了的,只有在意外的情况下需要重新建立),然后调用你在PAGEBEAN中写的处理事件的代码。当页面处理结束,HTML页面重新建立并发送到浏览器。

模型

模型封装了指定的应用中的数据和商业逻辑。它也提供了真实的商业对象和商务服务的抽象。

注意:要完全正确和一致,本图需包括以下的实现

oracle.apps.fnd.framework.server.OADBTransactionImpl而不是oracle.apps.fnd.framework.OADBTransaction接口。

Application Modules

一个BC4J应用模型是管理和提供BC4J模型对象的基础容器,在这个上下文中,同一任务的对象是由多方关联的。例如:所有的BC4J对象都包含一个相同任务的事务。甚至用户界面包括多个页面。

所有的APPLICATION MODULE都是oracle.apps.fnd.framework.server.OAApplicationModuleImpl的子类。

每一个OAF页面都有一个关联到顶层REGIONpageLayout region)的ROOT application module。这个root application module提供了事务处理的上下文,封闭了数据库的连接。

l         如果多个页面在一个事务中,它们应该共享一个root application module

l         如果一个页面和其它页面没关系,它应该有自己的application module

注意:一个root application module可能嵌套多个application module(也可以再嵌套多层)。在这种情况下,root application module可以访问它所嵌套的所有的数据、对象和所有的ROOT包含的参与同一个事务的子对象。你可以在你想创建重用的与数据库交互的UI region时使用这个特点。

Entity Objects(Association Objects)实体和关联实体

BC4J实体封装了关联到数据表行的商务规则(验证、动作等)。如:OAFSample Library包括了FWK_TBX_SUPPLIERS表,用来存储供应商的定义。我们可以为这个表定义一个实体对象(SupplierEO),用来实现的所有的商业规则,新建、更新、删除一个供应商。

注意:Entity Object也可以基于视图、同义词和快照。

OAF支持JAVAPLSQL实体。

你建立的大多数实体都应该是oracle.apps.fnd.framework.server.OAEntityImpl的子类。

在数据库和实体之间是一对一的关系,所有的ORACLE Applicaiotn 实体都应该包括它们关联的表的所有列。实体使用声明来在它们的属性和指定的数据列之间映射,来自动实现查询、插入、更新和删除。大多数情况下,你需要添加验证逻辑。

实体可以被任何需要与表交互的程序使用(不仅是OAF),这样一来,就必须考虑到所有的验证规则以便客户端就不用再关注这些了。

Association Objects(关联实体)

如果你有一个复杂的实体(如三层采购定单,在头、行、发运地之前是一对多的关系),你可以使用association object来定义实体间的关系,你可以定义弱连接(一个定单引用了已经存在的供应商)和强连接(一个定单包括它的行,行不能独立于头存在)。

View Objects(and view Links)视图对象和视图连接

在简单的情况下,一个BC4J视图对象封装了一个数据库查询。查询执行后,一个视图对象循环访问结果集。结果集包含一个或多个视图行,一个视图行的不同属性对应数据库查询的行。

所有的视图对象都是oracle.apps.fnd.framework.server.OAViewObjectImpl的子类。

每个视图对象都可以配置用以下的方法来查询数据:

1、属性对应SQL语句的列(通常用于较小、只读的视图对象)

2、属性对应实体对象的属性(用于插入、更新、删除实体对象)

3、一些属性对应到实体,一些属性直接对应SQL(用来增强实体对象的不能从实体对象查询的临时数据,如显示的计算值)。

OAF中,在下面的情况下会用到视图对象。

l         为详细的用户界面展示最优化的数据。如果用户界面支持实体对象的插入、更新、删除,你应该使用视图对象来完成这些任务。

l         为建立下拉列表建立查询,值列表和其它的界面组件。

l         为商业逻辑建立有效的“验证查询”。如:在采购定单头实体对象中,你可能要使用一个验证视图对象来取得这个采购定单的最大行号,以便于它可以被缓存而在新行插入时可以增加。

最后,你可能不只需要定义视图对象,还可能要为它们编写代码。典型情况下,代码应该实现复杂的查询的数据绑定并执行查询(所以视图对象知道如何查询它自己)。

视图连接

就像连接实体对象一样,你也可以创建视图对象的关联,这叫做视图连接。如:你在采购定单头视图对象和行视图对象之间建立了一个视图连接,这可以用来在访问头的时候自动查询行。

OADBTransaction

如上图所示:OADBTransaction在你的模型中的一个中心角色,它封装了JDBC的数据库连接会话和root application module的关联。并且直接容纳了你建立的所有实体对象(视图对象由root application module容纳,并在视图行中引用了实体对象)。你将在你的模型中正常使用OADBTransaction,基于以下原因:

l         建立callable statement来执行PLSQL函数的过程。

l         访问session级别的应用上下文,如用户名、id、当前职责等。

l         如果需要执行NLS操作,如转换服务器时间格式为用户时间格式,访问oracle.apps.fnd.framework.OANLSServices对象

root application module可以访问OADBTransaction

视图

视图用来为用户格式化和显示模型数据。

定义页面

在设计时,你可以使用声明的方式来建立BEAN的结构。在oracle开发过程中,你将对XML文件进行定义。当你部署到客户站点时,OAF从数据库中运行页面定义。

为了简单说明,Jdeveoper定义的页面由REGIONITEM组成。

l         ITEM是一个简单的组件,如按钮、输入框、图下等不包括子元素的组件。

l         REGION是包括ITEM的容器。如:header、表格或特定的布局组件。

l         你定义的每个REGIONITEM都有一个STYLE属性,用来指明OAF在运行时使用哪个WEB EBAN对象来为它实例化(这会指明产生什么要瓣HTML代码),如:如果你定义了一个STYLEtableREGIONOAF会用oracle.apps.fnd.framework.webui.beans.table.OATablebean来实例化。

l         所有的页面必须包含一个顶层的REGION(叫做root region,它的STYLEpageLayout,它是oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean的实例。

l         Jdeveoper的页面树中的REGIONITEM的顺序指明了在运行时添加BEAN结构的位置。

下图显示了一个简单页面的WEB BEAN显示效果,你看到的页面的标签指明了WEB BEAN的名字。如:一个下拉列表是oracle.apps.fnd.framework.webui.beans.message.OAMessageChoiceBean的实例,一个提交按钮是oracle.apps.fnd.framework.webui.beans.form.OASubmitButtonbean的实例。

 

注意:下面图中的ITEM名称没有按照ORACLE应用命名标准来做,只是让你明白WEB BEAN的结构。

 

Attribute Sets 属性集

每个REGIONITEM都可以使用属性集来继承一组属性,一个属性集是经过命名可重用的属性的集合,它可以被任何UI对象使用,包括region\item和其它属性集。无论何时你建立一个使用属性集的UI组件,你都可以覆盖它的继承的属性(尽管这在OAF中是不推荐的)。

为了说明这一点,在应用开发中,每个表格必须为他的每一列关联到属性集,这些属性集如提示标签、显示宽度等。

l         OAFToolBox示例中,有一个采购定单表(FWK_TBX_PO_HEADERS),HEADER_IDNUMBER类型的主键,也作为采购定单号显示。

l         这个表格有一个关联的属性集:FwkTbxHeaders,是一个XML包文件,里面包括了所有的表列的属性(每一列一个属性)。其中一个属性叫做HeaderId

l         HeaderId属性设置Prompt Order NumberDisplay Length15

l         当我们建立一个页面包括采购定单的order number 这个ITEM时,我们也应该指定属性集为/oracle/apps/fnd/framework/toolbox/attributessets/FwkTbxheaders/Headerid

 

组件重用

如果想组合页面中的共享对象,你可以简单的继承它们

如:在OAFToolBox示例中,我们建立了一个通用的REGION(叫PoSummaryRN),所以这个组件可以被多个页面包含而不用重写代码。要添加一个region到页面,我们只要简单的建立一个新的region,将Extends属性设为:/oracle/apps/fnd/framework/toolbox/tutorial/webui/PoSummaryRN

注意:这个共享的REGION在引用它的页面中是不能修改的,所以在JdeveloperStructure面板中的灰色的。

 

数据源绑定

对于有数据库交互(插入、更新、删除、查询)的BEAN,你还要指定一个数据源绑定到一个视图实例和关联的视图属性名称。这个绑定非常重要,因为OAF用它来查询数据、写回用户输入的数据。

l         View Instance Name指的是在application module中的视图对象(所有的视图对象都存活于application module中并通过它们的名称来调用),如:如果一个SuppliersVO视图对象由页面中的root application module通过“MySupVO”来调用,则在这里你应该指定MySupVO这个名字。

l         View Attribute Name 指的是映射到列的视图属性。如:如果你的SuppliersVO有一个属性“SupplierId(映射到列SUPPLIER_ID),这里你应该指定“SupplierId”这个名称。

定义菜单

你应该使用oracle application菜单和功能的表单中定义菜单。

正像OAF将定义的UI布局翻译成运行时的BEAN结构,它也包含了菜单定义的WEB BEAN

定义页面流

处理多页面事务流时,OAF提供了一个可定义的(可客户化)给复杂的、硬编码的控制逻辑。

客户化页面

OAF也包括了一个可定义的客户化架构,叫做:OA Personalization Framework。这是为了支持最终用户所需的客户化和产品传输链(区域化和垂直化(没懂什么意思)等)。

注意:如你在开发指南中的见的,建立REGIONitem声明比编程更可取。实际上,你应该只在不能用声明的方式来建立的时候才采用编程的方式,这样客户就能客户化你的页面了。