OAF_MDS系列1_OAF页面元数据结构MDS的解析(概念)
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的解析(概念)的更多相关文章
- OAF_MDS系列2_OAF页面的通过MDS多语言开发国际化(案例)
2014-06-06 Created By BaoXinjian
- 【Xamarin开发 Android 系列 7】 Android 结构基础(下)
原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...
- ext2元数据结构
概述 本篇博客主要描述ext2文件系统中的各种典型元数据结构,其中包括文件系统级别的元数据,如超级块,块组描述符等,也包括文件级的元数据,如文件目录项,文件inode等. ex ...
- 【Xamarin开发 Android 系列 6】 Android 结构基础(上)
原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...
- Innodb页面存储结构-2
上一篇<Innodb页面存储结构-1>介绍了Innodb页面存储的总体结构,本文会介绍页面的详细内容,主要包括页头.页尾和记录的详细格式. 学习数据结构时都说程序等于数据结构+算法,而在i ...
- 密码学系列之:Merkle–Damgård结构和长度延展攻击
密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...
- vue 快速入门 系列 —— Vue(自身) 项目结构
其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...
- Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
随机推荐
- kuangbin_ShortPath R (HDU 4370)
出题人真是脑洞堪比黑洞 (然后自己也被吸进去了 理解一遍题意 三个条件可以转化为 1的出度是1, n的入度是1, 2~n-1的出度等于入度 不难发现1-n的最短路符合题意 然而其实还有另一种情况 1为 ...
- dll--二进制层面的复用
积木式思想其实是很自然的一个过程,从c的库函数到C++的标准库,再到dll.com.com+都是这种思想推动下的结果,和现实生活中的人们的思维方式并无二致,只不过软件是在一个虚拟的世界中,并分化出许多 ...
- 机器学习算法基础(Python和R语言实现)
https://www.analyticsvidhya.com/blog/2015/08/common-machine-learning-algorithms/?spm=5176.100239.blo ...
- solr 主从模式和solrcloud集群模式
主从模式 主节点有单点故障问题:没有主从自动切换,没有failover,主机down掉了的话,整个数据变成只读.并且需要一台机单独做索引,浪费资源,所有数据都需要在这台机器上单独存在一份,索引变化较大 ...
- httplib
可爆破目录 import httplib import urllib def sendhttp(): data = urllib.urlencode({'@number': 12524, '@type ...
- Zookeeper 源码分析-启动
Zookeeper 源码分析-启动 博客分类: Zookeeper 本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...
- childNodes、nodeName、nodeValue 以及 nodeType
nodeName.nodeValue 以及 nodeType 包含有关于节点的信息. nodeName 属性含有某个节点的名称. 元素节点的 nodeName 是标签名称属性节点的 nodeName ...
- 用户编辑新建_AngularJS实现
实现思路: 分步骤完成开发,逐渐添加功能:1.实现输出users对象.2.实现点击“编辑”按钮,在表单中显示firstname和lastname,并不可修改.3.实现“新建用户”和“编辑用户”的切换. ...
- PIP安装Python的scipy,scrapy等包出现“failed building wheel for xxx”问题解决办法
1.在这里下载对应的.whl文件,注意别改文件名! http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml Ctrl + F,输入lxml,找到下面这段 Lxm ...
- centos7 关闭SELINUX 防火墙
关闭SELINUXvi /etc/selinux/config#SELINUX=enforcing #注释掉#SELINUXTYPE=targeted #注释掉SELINUX=disabled #增加 ...