本文由105780520贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
(一 Oracle EBS OA Framework (一) 开发环境搭建
关键字: Oracle EBS ERP OA Framework OAF 关键字: 最近公司开始了一个 Oracle ERP 二次开发项目,使用的是 EBS R12 版本,这个版本由于比较新, 从这个版本中可以看到 Oracle ERP 二次开发的主要技术有向 Web 方面发展的趋势,其中主要使用 的就是 Oracle OA Framework 应用框架.
网上这些资料不好,我通过查看 OA Framework Guide 整理了一些文档,后面陆续会发布到 blog 中与大家共享.
内容基本上是按我的学习顺序组织的,学到哪里写到哪里,由于是初学 OA Framework,而它又与 我们通常接触的开源框架差异较大,因此理解上难免出现偏差,有不正确的地方请大家指正. 由于系统的限制,不能发过多的插图,文章中的插图没有全部贴上来,这些插图都来自于 OA Framework Guide.
环境塔建按以下几个步骤: 1.从 MetaLink 上下载 p5856648_R12_GENERIC.zip 2.从你的 EBS 服务器上下载 dbc 文件,比如我的 dbc 位置 /u02/prod/inst/apps/PROD_ebs/appl/fnd/12.0.0/secure/PROD.dbc 3.启动 JDeveloper,从 JDeveloper 解压目录中到 ToolBox 工程,初次打开时会提示代码更新. 4.在工程
的属性中到 Oracle Applications 配置好 Database Connection. 5.在工程的属性中到 Oracle Applications -> Runtime Connection 页,将 DBC File Name 设 置为从服务器上下载的 dbc 文件.User Name 和 Password 为登录 ebs 环境时使用的用户名和密码. Responsibility 中设置好开发所使用的应用简称和职责.这个职责只需要是 User Name 所具有的 职责就可以了.
Page 基础
在浏览器看来,OA Framework 页面与其它 web 页面一样,被渲染为 HTML.
在中间层中,页面是由内存中层级分布的 Javabeans 组成——非常像传统的 Java 客户端 UI.每个 UI 构件,比如按钮,表格,tab,商标图像等,被渲染为页面中对应的构件.
浏览器向一个页面发出请求时, Framework 读取页面定义的元数据创建 web bean 结构. OA 每个 bean 与一个 UI 控制器关联, Framework 调用你编写的代码初始化页面. OA 页面处理完成后, Framework OA 将 web bean 结构交给 UIX 框架处理以生成发送给浏览器的 HTML.
当浏览器发出一个表单提请求时,OA Framework 重新创建 bean 及其层次结构(只在必要的时候才 重新创建,通常这些 bean 是被缓存的,只在特定的情况下才重新创建),然后调用为 page bean
编写的事件处理代码.当页面处理完成后,页面 HTML 重新生成并发送给浏览器. OA Framework MVC
架构:
模型 Model
模型包括下层的数据和应用业务逻辑.它也提花了现实世界对象和应用服务间的抽像层.
应用模块 Application Modules
BC4j 应用模块本质上是一个容器, 它管理和提供对"相关"BC4J 模型对象的访问. 这里的"相关" 指的是同一个任务中的参与者.比如所有的 BC4J 对象在同一个任务中参与同一个事务——即使对 应的用户界面需要用户访问多个页面. 应用模块:
应用模块是 oracle.apps.fnd.framework.server.OAApplicationModuleImpl 类的子类.
每个 OAFramework 页都有一个根(root)应用模块,它与最顶层的页面区域(page region)关联. 根应用模块提供事务环境和连接数据库.
如果多个页面参与同一个物理或虚拟事务,它们应该共享相同的根应用模块. 如果一个页面功能不依赖于其它东西,它需要拥有自己的应用模块.
注意: 注意: 一个根应用模块可能包含一个或多个嵌套的应用模块,可以嵌套任意多的层次.这种情况 下,根应用模块可以访问它包含的子对象的数据和对象,所有子对象共享根应用模块的事务.你可 以在创建需要重用的与数据库操作相关的 UI 区域时使用这个功能.
实体对象( 实体对象(Entity Objects)和关联对象(Association Objects) )和关联对象( )
BC4J 实体对象包含了业务规则(校验,动作等)与数据库表中的一行关联. 注意: 注意: 实体也可以基于视图,同义词,快照而定义. OA Framework 支持 Java 和 PL/SQL 实体.
实体对象:
多数实体是 oracle.aps.fnd.framework.server.OAEntityImpl 的子类 (PL/SQL 继承于特殊版本的 OAEntityImpl).
表和实体对象一一对象, 所有实体应该包含与之关联的表的所有列. 实体对象使用映射了它的属性 和数据库列,并自动实现了查询,插入,更新,删除等操作.多数情况下,我们只需要添加校验逻 辑. 实体对象可以用于任何程序(不限于 OA Framework). 关联对象 Association Objects 用于定义实体间的关系.
视图对象( 视图对象(View Objects)和视图链接(View Links) )和视图链接( )
BC4J 视图对象处理数据库查询.查询执行后,视图对象提供了访问它的结果集的功能.结果集包 含了一个或多个视图行,视图行与数据库查询的行相对应. 视图对象:
所有的视图对象都是 oracle.apps.fnd.framework.server.OAViewObjectImpl 类的子类. 视图对象可以配置为使用下面的策略查询数据:
它的属性映射到简单的 SQL 语句的列(通常用于小的只读的视图对象) 它的属性映射到实体对象的属性(用于插入,更新和删除实体) 一些属性映射到实体对象,一些直接映射到 SQL(用于增加实体临时数据,这些数据不能通过实体获得, 比如计算值或用于 UI 显示需要)
在 OA Framework 应用中,将在下面情况下使用视图对象:
呈现用于优化用户界面细节的数据.如果用户界面支持实体的插入,更新,删除,你将通过视图对象执 行这些操作. 为 poplists,lists of
values 和其它 UI 组件创建简单的查询. 为业务逻辑创建有效的"校验查询(validation queries)".比如,在定单处理时使用一个校验视图对象获 得最大可以购买的商品数量.
可以为视图对象编写代码用于实现复合查询或查询时的数据绑定 (以便视图对象知道怎样"查询" 自己). 视图链接 View Links
与实体对象类似,也可以为视图对象建立关联,称为视图链接(view links).比如可以在定单头 视图对象和定单内容间建立视图链接对象.这可以用于在运行时访问定单头时自动查询定单内容.
OADBTransaction
OADBTransaction:
注意: 注意: 准备的来说这个图应该要包含实现类 oracle.apps.fnd.framework.server.OADBTransactionImpl 替代 oracle.apps.fnd.framework.OADBTransaction 接口.
如图所示, OADBTransaction 扮演的是模型中的中心角, 因为它与一个根应用模块关联, 管理 JDBC 连接/数据库会话,直接拥有你创建 的任何实体(根应用模块拥有的视图对象中的行指向实体对 象).可以使用 OADBTransaction 在模型代码中完成下面的操作:
创建一个语句执行 PL/SQL 函数和存储过程 访问应用会话级环境信息(session-level Application context information) ,比如:用户名,id,当前责任 (resposibility)等. 访问一个 oracle.apps.fnd.framework.OANLSServices 对象,如果你需要执行 NLS 操作,比如转换服务器时 间到用户日期/时间等.
可以通过根应用模块访问 OADBTransaction.
视图
视图格式化当前模型数据给用户.
定义页面
在 Oracle Applications 开发时,将使用 XML 页面定义文件.当产品发布后,OA Framework 从数 据库获取页面定义. 使用 JDeveloper 定义的页面(pages)由区域(regions)和条目(items)组成.
条目是简单的构件,比如按钮,输入域,图像等,它不包含子构件.
区域是容器对象它可以包含条目和其它区域.比如区域包含文件头(headers) ,表格和特别的布局组件 (layout components) . 定义的每个区域和条目都有 style 属性,它告诉 OA Framework 使用哪个 web bean 对象来描述它.比如, 如果你定义区域的 style 属性为"table",OA Framework 将使用 oracle.apps.fnd.framework.webui.beans.table.OATableBean. 所有页面必须有一个单一的 top-level region(通常称为"root region")它的 style 为 pageLayout.它将使用 oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean. regions 和 items 显示在 JDeveloper page tree 中的顺序告诉了 Framework 将这些对象添加在什么位置.
属性集 Attribute Sets
每个 region 或 item 通过使用 attribute sets 可以继承一组属性集合.attribute sets 是一个被 命名的属性的集合, 可重用于任何 UI 对象, 包括: regions, items 和其它属性集. 当使用 attributes set 创建 UI 时,你可以覆盖所继承的属性. 组件重用 如果需要
在页面使用共同对象,可以简单的从它继承.
比如, 可以创建一个通用的 region. 新建 region 时, 将新 region 的 Extends 属性设置为通用 region 的命名. 注意: 注意: 共享的通用 region 在引用它的 page 中是不可编辑的,属于它的选项目在 JDeveloper 中 将显示为灰. 数据源绑定
对于需要与数据库交互的 bean,你需要指定数据源,将它绑定到 View Instance Name,并关联好 View Attribute Name.这个绑定是至关重要的,因为 OA Framework 使用它获取数据,并将用户输 入的数据写入下面的视图对象.
View Instance Name 指向当前上下文环境中包含应用模块中的视图对象 (所有视图对象"生活"于一个应用 模块中,在包含它的容器对象中有一个实例变量名) .比如,如果 SuppliersVO 视图对象,在页面的根应 用模块中有一个实例变量"MySupVO". View Attribute Name 指向视图对象中映射到数据库列的属性.
定义菜单 定义页面流 个性化页面
控制器
控制器响应用户动作控制应用流转.
控制器可以与视图中的 region 级的对象关联(任何实现 oracle.apps.fnd.framework.webui.beans.OAWebBeanContainer 的 OA Framework web bean 都可 以与控制器关联). 控制器是 oracle.apps.fnd.framework.webui.OAControllerImpl 的子类. 控制器代码的行为:
生成/初始化 UI 中途截取或处理用户事件,比如按钮按下
请求处理
当浏览器向 OA.jsp 请求一个页面时:
1. oracle.apps.fnd.framework.webui.OAPageBean(OA Framework 主页面处理类)根据请求的页面名称检查需 要哪个根应用模块,并从应用模块池(application module pool)中取出.这个应用模块将为页面从 JDBC 连接池中获取连接和事务上下文. 2. 用户会话校验; 如果无效, 将显示登录页面 (这里是简化的说法,
具体细节在 Developer's Guid 中有说明) . 3. 如果用户有效,OAPageBean 根据请求参数处理 HTTP POST 或 GET.
处理 GET 请求
当浏览器发起 GET 请求一个 page 时(或你手工 forward 时),OA Framework 使用描述的 UI 定义 构建 web bean 层级结构:
1. OAPageBean 调用页面的 top-level pageLayout bean 的 processRequest()方法, 然后进入 web bean 层级结构 中继续递归调用来初始化 web beans(包括任何相关的模型组件) . 1. 每个 web bean 可以有自己的控制器,如果有就调用控制器的 processRequest(OAPageContext pageContext, OAWebBean webBean)方法. 这个方法可以用于构件或修改页面布局, 设置 web bean 属性和执行任何手工的数据初始化工作(比如,打开页面时自动执行查询) . 2. 一些复杂的 web beans(比如:oracle.apps.fnd.framework.webui.beans.table.OATableBean 和 oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean)通过调用它们的 prepareForRendering()(这个方法在 JavaDoc 中的说明)方法执行 post-controller 处理. 3.
每个 web bean 调用它的子对象的 processRequest()方法. 2. oracle.apps.fnd.framework.webui.OAPageBean 将 web bean 结构传递给 UIX 渲染并发送给浏览器.
处理 POST 请求
当浏览器向服务器页面发出 POST 请求时:
1. OAPageBean 检查 web bean 层级结构是否在内存中. 如果没有它就像在 GET 请求中一样创建一个 web bean 层级结构. 2. OAPageBean 调用整个层级结构中的 web bean 的 processFormData(OAPageContext pageContext, OAWebBean webBean)方法,并将 form 中的数据写入模型(它在 pageLayout region 上调用 processFormData(),然后在它的子对象上递归的调用 processFormData()方法) .将 form 数据写入模 型时 将自动调用属性和实体级别(attribute and entity-level validations)的校验,如果抛出了任何校验异常, 处理将停止,错误信息将显示给用户. 3. 如果在执行 processFormData()期间没有异常抛出, OAPageBean 将使用与上面相同的方法在层级结构中的 所有 web bean 上调用 processFormRequest(OAPageContext pageContext, OAWebBean webBean)方法.这里 给了你的控制器响应用户动作的机会. 4. 如果没有 JSP forward 或 redirect 发出,或在执行 processFormRequest()方法时没有异常被抛出.则页面刷 新.
OAPageContext
当 OA Framework 收到一个 OA.jsp 请求时,OAPageBean 创建一个 oracle.apps.fnd.framework.webui.OAPageContext,这个类仅在页面处理过程中存在.上面描述 的三个
方法 (processRequest(),processFormData(),processFormRequest())都有一个 OAPageContext 参数,任何将要编写的控制器代码都使用了这个至关重要的类.
如上图所描述的,OAPageContext 有指向 request 和根应用模块的引用.根据这个关系, OAPageContext 被传递到每个控制器的响应处理方法中,你将看到如何在下面的通用任务中使用 OAPageContext: 访问请求参数 可以使用 getParameter(String name)方法读取请求参数. 技巧: 技巧:
页面上的每个 web bean(buttons,fields 等等)传递给 getParameter()的是你定义在页面上的 唯一 ID 属性.比如,使用下面的代码可以得到用户是否按下了名为"GoButton"的按钮: processFormRequest(OAPageContext pageContext, OAWebBean webBean){ if (Parameter("GoButton") != null) { // The user pressed the "Go" button, do something…… } }
访问根应用模块
OAPageContext 缓存了根应用模块的引用,它可以访问视图对象和事务.如果需要访问应用模块, 可以通过 OAPageContext: processFormRequest(OAPageContext pageContext, OAWebBean webBean){ OAApplicationModule am = (RootApplicationModule(); } 发出导航指令 使用方法告诉 OA Framework 执行 JSP forward 或客户端重定向.比如: processFormRequest(O
APageContext pageContext, OAWebBean webBean){ if (Parameter("CreateButton") != null) { // The user pressed the "Create Supp
lier" button, now perform a JSP forward to // the "Create Supplier" page.
pageContext.setForwardURL("OA.jsp?page=/oracle/apps/dem/employee/webui/EmpDetailsPG", null, OAWebBeanConstants.KEEP_MENU_CONTEXT, null, null, true, // Retain AM OAWebBeanConstants.ADD_BREAD_CRUMB_YES, // Show breadcrumbs OAWebBeanConstants.IGNORE_MESSAGES); } } 访问应用上下文信息 与模型中的 OADBTransaction 类似,OAPageContext 可以访问 servlet session 级的 Oracle Application 上下文信息,如:用户名,ID,当前职责等.比如,下面的片段用于获取用户名: processRequest(OAPageContext pageContext, OAWebBean webBean){ String userName = UserName();}
Web Bean 架构
所有 OA Framework web beans 都与 UIX framework 中的 bean 对应.比如,OATableBean 继承自 oracle.cabo.ui.beans.table.TableBean ("cabo"是 UIX framework 早期的名字,包定义仍然使 用了旧名).
每个 OA Framework web bean 都实现了一组接口,这些接口实现了 OA Framework 添加到基础的 UIX beans 上的行为.
oracle.apps.fnd.framework.webui.beans.OAWebBean 定义了所有 web beans 的通用行为(比如,其中在这 里定义的关键的行为有 processRequest,processFormData, processFormRequest 方法,一些 beans 自己 实现了这些方法) . oracle.apps.fnd.framework.webui.OAWebBeanConstants 用于视图和控制器的常量集合. oracle.apps.fnd.framework.webui.beans.OAWebBeanData 定义通用的个性化定义和数据源管理行为 oracle.apps.fnd.framework.webui.beans.OAWebBeanContainer 定义所有可以作为其它 web beans 容器的 web beans 的特性.比如,所有 layout web beans 都实现了这个接口.只有实现了这个接口的 beans 才可 以与控制器关联. OAWebBean 定义了 bean 在 OA Framework 上下文环境中的内在特性.比如,OATableBean 实现的 oracle.apps.fnd.framework.webui.beans.OAWebBeanTable 接口.
web bean 例子(OATableBean):
内部 Bean 结构 每个 web bean 自己包含了下列的信息:
_indexedChildren 子 web beans _namedChildren 子 web beans 特殊行为的 UIX 标记. _attributes web bean 的特性(属性描述) ,下表的图表描述
jdbc连接oracle描述 web bean 使用 Dictionary 保存键值对属性:
数据绑定值
与上面的图表描述的情况不同,OA Framework web bean 的 attributes 实际上是用数据绑定值实 现的,这意味着它是由下层的数据源提供的,在组件被渲染时才被获取.后面将看到如何定义用户 自定义绑定值. 渲染 在页面渲染时,UIX framework 处理 web bean 层级对象产生页面的 HTML 代码.
对于每个 web bean 属性,UIX 调用它的 getAttributeValue()方法.并传递给它一个渲染上下文 (rendering context),rendering context 是 UIX 决定绑定值的全部基础.对于给出的属性, 比如, rendering context 知道下层的视图对象实例, 视图属性和当前的行. 数据绑定使用 rendering
context 通过查询它的数据源

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。