2014-06-06 Created By BaoXinjian

一、摘要


在OAF编译文件时,系统会通过XMLImport将所编译的XML文件,编译到数据库中,也就是MDS(Meta data Service),元数据库

而在OAF在展现给用户时,系统将存放MDS的内容,再通过程式组合成XML页面定义文件,并进行渲染

所以MDS可以存放了OAF页面的定义,所以二次开发时,在编译XML文件后,并不需要XML文件存放在服务器上

这个和Form Builder的fmx 和 fmb文件有类似性,fmx为编译后的问题,fmb是代码文件,在执行时只需要fmx文件

而OAF在页面文件做的更加彻底,直接存放在数据库中,但是很多java class包还是通过文件调用的方式,本文只做页面定义文件相关的MDS的解释

  • 与MDS相关的Table

    • jdr_paths                 --存储OAF页面路径(目录树)
    • jdr_components         --存储OAF组件树
    • jdr_attributes            --存储OAF组件的attribute
    • jdr_attributes_trans   --存储OAF组件的翻译,多语言或国际化的实现基础
  • 与MDS相关的script
    • jdr_mds_internal
    • jdr_utils
    • jdr_custom_internal
    • jdr_docbuilder

页面设计的XML定义


在OAF页面开发中,开发人员使用JDeveloper可视化工具来设计Web页面,页面有一个个组件嵌套组合而成,最后形成一个XML格式的页面定义文件。

在EBS中可以通过Abort this Page 的功能来查找出页面相关的信息,如页面结构、个性化、页面上下文、Java系统属性、预置文件等等,

利用这个功能查询出页面的路径:

然后切换到Output标签页,可以看到OAF页面的XML定义,如果页面定义信息过多,可以增加Buffer Size后再次运行,如下便是PO Document Types页面的定义信息,

从页面定义信息中可以得知OAF页面的组成,所使用的AM, Region使用的CO等信息,通过这个方法可以分析和查看标准的OAF页面和功能.

Step1. 使用About This Page

Step2. 获取Page的定义link

Step3. 通过jdr_util.print_documents查看Page定义的xml文件

页面元信息存储结构


实现上在使用XMLImporter导入OAF页面信息的时候,XMLImporter解析OAF页面定义XML文件,然后将页面信息分别存储在下图的几个表中。

OAF页面元数据主要存储在上图中的3个表中:

1. JDR_PATHS:存储了页面路径的结构以及OAF页面个性化的结构信息

/bxj/oracle/apps/ap/expense/webui/ExpenseSummaryPG这是OAF页面的路径,它会被拆分为树型结构存储在JDR_PATHS表中,请看下面:

其中/bxj/oracle/apps/ap/expense/webui都是属于PACKAGE类型, 而最后的ExpenseSummaryPG是DOCUMENT,即是一个XML文档

通过最后这个一系列的父子关系关联,组合成了一个完整的Page的路径

2. JDR_COMPONENTS:存储了页面组件信息,OAF页面组件被分解后存储在此表中

上面从JDR_PATHS表中查询出来类型为DOCUMENT的节点DocumentTypesPG,查询它的组件属性如下:

对比上面查询出来的结果和通过jdr_utils.printDocument(‘/bxj/oracle/apps/ap/expense/webui/ExpenseSummaryPG’)工具导出的XML文件内容就会发现,

JDR_COMPONENTS中的数据是将XML文件中的OAF组件分解得到的

3. JDR_ATTRIBUTES:存储了页面各组件的属性

使用下面的SQL查询出页面组件的属性信息

4. JDR_ATTRIBUTES_TRANS

存放了语言定义,之后再做OAF多语言开发中会详细介绍

5. 总结

从上面的OAF元数据存储不难看出,OAF开发完成后,使用XMLImporter工具导入OAF页面的时候,XMLImport工具将页面定义XML文件按照组件进行分解,

  • 将文档的结构信息存储到JDR_PATHS中;
  • 将组件信息保存到 JDR_COMPONENTS中;
  • 组件的属性保存到JDR_ATTRIBUTES中;
  • 多语言信息保存到JDR_ATTRIBUTES_TRANS中;

而当运行OAF页面的时候,

  • OAF引擎根据 Function定义中的URL地址,即OAF页面的页面路径;
  • 首先到JDR_PATHS表中查询出 DOCUMENT的节点;
  • 然后再从JDR_COMPOENTS 和 JDR_ATTRIBUTES表中取得组件和属性信息后输出Web页面;
  • 再根据语言环境确定是否要从JDR_ATTRIBUTES_TRANS中取值多语言信息;

所以发布OAF应用的时候, 页面定义文件是无需上传到JAVA_TOP下的.

熟悉了JDR相关的结构之后,对于我们理解OAF的工作原理,以及解决一些疑难杂症非常有帮助. 同时对于OAF页面的个性化也会涉及到这几张表.

Thanks and Regards

参考: 张礼军 http://oracleseeker.com/2009/08/11/explained_meta_data_for_page_of_oracle_application_framework/

OAF_MDS系列1_OAF页面元数据结构MDS的解析(概念)的更多相关文章

  1. OAF_MDS系列2_OAF页面的通过MDS多语言开发国际化(案例)

    2014-06-06 Created By BaoXinjian

  2. 【Xamarin开发 Android 系列 7】 Android 结构基础(下)

    原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...

  3. ext2元数据结构

    概述           本篇博客主要描述ext2文件系统中的各种典型元数据结构,其中包括文件系统级别的元数据,如超级块,块组描述符等,也包括文件级的元数据,如文件目录项,文件inode等.   ex ...

  4. 【Xamarin开发 Android 系列 6】 Android 结构基础(上)

    原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...

  5. Innodb页面存储结构-2

    上一篇<Innodb页面存储结构-1>介绍了Innodb页面存储的总体结构,本文会介绍页面的详细内容,主要包括页头.页尾和记录的详细格式. 学习数据结构时都说程序等于数据结构+算法,而在i ...

  6. 密码学系列之:Merkle–Damgård结构和长度延展攻击

    密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...

  7. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  8. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. Web攻防系列教程之文件上传攻防解析(转载)

    Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...

随机推荐

  1. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  2. URAL 1291 Gear-wheels(BFS)

    Gear-wheels Time limit: 1.0 secondMemory limit: 64 MB - Arny! What happened with coordinator? Bad wo ...

  3. Java——关于String(字符串)

     String s = "abc";//创建一个字符串对象在常量池中. String s2 = new String("abc");//创建两个对象   一 ...

  4. jQuery对下拉框Select操作总结

    jQuery对下拉框Select操作总结 转自网络,留做备用 jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change( ...

  5. DDD, MVC & Entity Framework

    https://digitalpolis.co.uk/software-thoughts/ddd-mvc-entity-framework/ Data Points - Coding for Doma ...

  6. Python编程规范(PEP8)

    Python编程规范(PEP8) 代码布局 缩进 对于每一次缩进使用4个空格.使用括号.中括号.大括号进行垂直对齐,或者缩进对齐. 制表符还是空格? 永远不要将制表符与空格混合使用.Python最常用 ...

  7. cacti 添加

    一,为已有host添加新的监控图 (基于snmp) 在console控制台下点击“New Graphs”,选择要添加监控图的主机.在Graph Templates中选择一个Graph模板,本例选择SN ...

  8. 微软发布了ASP.NET WebHooks预览版

    微软 近期发布了ASP.NET WebHooks的预览版 ,这是一个可用于创建及使用Webhook功能的库.WebHooks支持MVC 5及WebApi 2. Webhook是一种通过HTTP实现用户 ...

  9. CentOs 设置静态IP 方法 dhcp的配置

    0.自动获取配置 DEVICE=eth0 HWADDR=00:0C:39:AD:11:48 TYPE=Ethernet UUID=c230a1e5-a535-487a-aab5-2fad7cd5583 ...

  10. 【linux】rpm常见命令

    查看包依赖模块:http://www.rpmfind.net/ rpm  -ivh [包名] :安装rpm包 rpm  -e [包名] :删除rpm包 rpm  -aq [包名] :查询rpm包 rp ...