首页 web前端 html教程 EBS OAF 页面的技术剖析(2)_html/css_WEB-ITnose

EBS OAF 页面的技术剖析(2)_html/css_WEB-ITnose

Jun 24, 2016 pm 12:05 PM
剖析 技术 页面

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

原文来自于OAF开发文档

OADBTransaction

图5:基础模型架构-OADBTransaction


注意:要完全的精确和兼容,这个图应该包含实现类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的访问是由根应用模块所提供的。

界面视图

界面视图格式化并展示模型数据给用户。

第三章的实现界面视图里详细介绍了下面的内容。

定义页面

在开发期间,你可以使用声明式JDeveloper工具为每个页面指明bean的层次结构,JDeveloper在Building “Hello, World”里有介绍。在Oracle E-Buisness Suite开发中,你会使用(源控制)XML文件来进行页面定义。当你的产品部署到一个客户的站点时,OAF框架会在数据库存储之外运行这些页面定义。

简介概括来说,你可以使用JDeveloper来定义由区域和items组成的页面.

l  Items是简单的小部件就像按钮,字段,图像等等不包含子控件的小控件。

l  区域是容器对象,它可以包含items和其它的区域。区域是示例比如headers, tables和特殊的布局组件。

l  每个你定义的区域和Item都有一个style属性,它会告诉OAF框架如何在运行时怎么去实例化这个web bean(这个也表明了为这个bean要生成什么HTML)。比如,如果你定义了一个区域它的style属性为”table”,那么OAF会实例化一个oracle.apps.fnd.framework.webui.beans.table.OATableBean对象。

l  所有的页面必须有一个顶层的区域(一般称为”根区域”),它的style为pageLayout,会被实例化为oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean对象。

l  在JDeveloper页面树(和相应的XML文件)中区域和items的顺序会告诉OAF框架把这些对象加到运行时bean组织层次中哪个地方。

下面的图6给了一个实例化的示例页面的各种web beans的幕后外观。你看的的标签是后面的web beans的名称。比如,一个弹出式列表实例化为oracle.apps.fnd.framework.webui.beans.message.OAMessageChoiceBean,一个提交按钮实例化为oracle.apps.fnd.framework.webui.beans.form.OASubmitButtonBean.

图7展示了相应的页面定义。

图6:UI组件页面展示了相应web beans的名称


注意:下面显示的区域和item名称不符合Oracle EBS命名标准;反而,它们是用于帮助你解释相应的结构到相应的web beans.

图7:JDeveloper中页面结构


属性集

每个区域或者item都可以使用属性集来继承属性组的设置。一个属性集时一个命名的,可重用的属性集合,它可以别任何类型的UI对象属性,包括区域,item和其它的属性集。每当你建立了一个使用了属性集的UI,你可以覆盖继承的属性(虽然在OAF编程标准中是不鼓励的)。

要演示这个概念,在应用开发中,每个表必须为每个显示列关联属性集。这些属性集包含提示,显示宽度等等属性。

l  在OAF ToolBox Sample Library/Tutorial中,有一个采购订单表(FWK_TBX_PO_HEADERS),其主键列类型为NUMBER且名为HEADER_ID,它也作为采购订单号显示给用户。

l  这个表有一个叫做关联的FwkTbxPoHeaders属性集XML包文件,它包含了表中所有显示列的属性集(每个列都有一个属性集)。其中之一的属性集叫做HeaderId

HeaderId属性集有一个Prmpt属性设置为Order Number并且显示长度设置为合理的15.

l  当你创建一个包含采购订单编码Item的页面时,我们可以设置它的属性集属性为完全合适的名为/oracle/apps/fnd/framework/toolbox/attributesets/FwkTbxPoheaders/Headerid的属性集。

图8:在JDeveloper中使用一个属性集


组件重用

组件重用

如果你想包含共享对象到你的页面中,你可以简单继承它们。

比如,在OAFToolBox Sample Library/Tutorial中,我们创建了一个通用区域(名为PoSummaryRN),因此同样的内容不需要编码就可以包含在多个页面中。要加一个共享区域到一个页面,我们只需要简单创建一个新的区域,然后设置它的Extends属性为共享区域的符合条件的全名称: /oracle/apps/fnd/framework/toolbox/tutorial/webui/PoSummaryRN

注意:在引用页面,共享区域是不可以编辑的,因此它的items在JDeveloper结构面板中都是灰色的。

图9:在JDeveloper中扩展一个区域


数据源绑定

对于任何需要和数据库交互的beans(查询,插入,更新和/或者删除),你也需要指定一个绑定到View Instance Name数据源并且关联View Attribute Name.这个绑定至关重要,因为OAF框架使用它从潜在的视图对象中获取查询数据或者写用户输入的数据到视图对象实例中。

l  View Instance Name属性引用它所包含的应用模块上下文中的潜在的视图对象(所有的视图对象都”存活”于一个应用模块中并且在它的容器内由实例名称来标示)。比如,如果一个SupplierVO视图对象在你页面的根应用模块中由实例名称”MySupVO”标示,”MySupVO”这里就是你指定的名称。

l  View Attribute Name引用了映射到列的潜在视图对象中的属性。比如,如果你有的SupplierVO有一个”SupplierId”属性(它映射到了潜在的SUPPLIER_ID列),“SupplierId”在这里就是你指定的名称。

定义菜单

所有的OAF应用就像Oracle Browser Look and Feel (BLAF) UIGuideline: Tabs/Navigation.描述的都包含菜单。你可以使用Oracle EBS的菜单和功能定义forms声明式的定义这些菜单结构。稍后我们会在开发文档中详细介绍这个。

就像OAF会翻译你的声明式UI布局到运行时的bean层次结构,它也包含了声明式的菜单定义的web beans.

定义页面流

当处理多页面事务流时,OAF框架为复杂的硬编码的控制器逻辑提供了一个声明式(因此可客制化)的方法。关于这个功能的额外信息可以参考Chapter 4: Declarative Pageflow UsingWorkflow。

个性化页面

OAF框架也包含了一个声明式的叫做OA Personalization Framework客制化的基础设施.这是为了终端用户和产品发布链支持客制化的相应(更改本地化,排列等等)。

注意:就像你在开发文档中看到的,声明式的创建区域和item比编程创建它们更好。实际上,你仅应该当你不能声明式的创建它们时才通过编程式创建组件,这样客户可以个性化你的工作。

控制器

控制器响应用户的动作并指引应用流转。

第三章中的Implementing the Controller文档更详细的描述了下面的内容。

控制器可以在区域层次上界面视图进行关联(从更普遍的角度来看,任何实现了oracle.apps.fnd.framework.webui.beans.OAWebBeanContainer接口的OAF web beans都可以关联控制器)。

所有你创建的控制器都像下面图10中展示的继承于oracle.apps.fnd.framework.webui.OAControllerImpl。

控制器类是你定义webbeans如何表现的类。特别的是,你写控制器代码用于:

l  在运行时操作/初始化UI(包含任何编程实现的而不能通过声明式实现的布局)

l  拦截和处理比如按钮按下的用户事件。

请求处理

当浏览器为你的页面发出一个OA.jsp请求时:

1.        oracle.apps.fnd.framework.webui.OAPageBean(主要的OAF页面处理类)使用页面名称来决定它需要哪个应用模块,因此它可以从应用模块池中取出其应用模块实例。这个应用模块也会从连接池取出一个JDBC连接,并且页面的事务上下文也会建立起来。

2.        验证用户会话;如果无效,会显示登录页面(注意这是为了简单化;更多详细信息会在后面的开发文档中有提及)。

3.        假设用户是有效的,OAPageBean会根据请求参数来判断正处理的是HTTP POST还是GET请求。

处理GET请求

当浏览器发出一个GET请求到服务器来请求一个页面时(或者你手工转向它),OAF框架会使用声明的UI定义来构建web bean的层次结构:

1.      OAPageBean会调用页面顶层pageLayout bean的processRequest()方法,然后整个web bean层次结构都会如下被递归处理来初始web beans(包括任何关联的模型组件):

1.        每个web bean实例化它的控制器?如果它有的话?并调用控制器上的processRequest(OAPageContextpageContext, OAWebBean webBean)方法。这个方法是你用于构建/修改你页面布局,设置webbean属性和做任何手工数据初始化(如果,比如,当你导向到一个页面时,你需要做自动查询)的方法。

2.        一些复杂的webbeans(像oracle.apps.fnd.framework.webui.beans.table.OATableBean和oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean)需要通过调用他们的prepareForRendering()方法来做post-controller处理(这个方法在相应的bean Javadoc里有详细描述)。

3.        每个web bean调用它的子控件的processRequest()方法。

2.      oracle.apps.fnd.framework.webui.OAPageBean把web bean的层次结构交给UIX来生成页面并发送给浏览器。

处理POST请求

当浏览器为一个页面向服务器发出一个POST请求时:

1.      OAPageBean检查是否web bean层次结构已在内存中。如果没有(因为资源已经被回收,用户通过浏览器的回退按钮导航,或者从一个消息对话框页面发出一个POST请求到主页面),它会就像在上面GET请求处理中描述的一样来重新创建层次结构。

2.      OAPageBean调用在层次结构中的所有beans的processFormData(OAPageContextpageContext, OAWebBean webBean)方法来把form数据写回到模型中(特别的,它会调用pageLayout区域上的processFormData()方法,然后每个web bean递归调用它的子控件上的processFormData()方法)。写回form 数据到对应的模型会自动调用属性和实体级别的验证,并且如果你抛出任何验证异常,处理就会终止并且错误消息会显示给用户。

3.      如果在processFormData()阶段没有抛出异常,OAPageBean就会使用上面描述的方式来调用在层次结构中的web bean的processFormRequest(OAPageContextpageContext, OAWebBean webBean)方法。这样你的控制器代码就有机会来对用户的动作作出相应的处理了。

4.      如果没有JSP转向或者页面重定向请求发出--或者异常在processFormRequest()抛出?那么页面就会被刷新。

OAPageContext

当OAF框架收到一个OA.jsp请求时,OAPageBean会创建一个oracle.apps.fnd.framework.webui.OAPageContext对象,这个类仅存在于页面的处理期间。上面描述的3个重要方法(processRequest(), processFormData()和processFormRequest())的每一个都使用OAPageContext作为参数,并且任何你写的控制器代码都会利用这个重要的类。

图10:OAPageContext类和其它关键类的关系


就像上面的图演示的,OAPageContext有对请求和根应用模块的引用。有了这些关系,OAPageContext被传递给每个你的控制器响应处理的方法,你就可以知道如何在下面列出的常用任务使用OAPageContext:

访问请求参数

可能最重要的,这是你用于读取请求参数值的类,通过调用一个简单的方getParameter(Stringname)法(记住请求包含全部URL参数加上?如果是一个POST请求?全部form字段值,加上用户选择的关联动作/控制部件的名称和事件)。

小技巧:对于你的页面上的单个web beans(按钮,字段等等),传递给getParameter()的name的值是相应的你在定义页面时分配的标识ID。因此,比如,你可以在控制器里写下面的代码阿狸知道是否用户按了你在JDeveloper命名为”GoButton”的按钮

processFormRequest(OAPageContextpageContext, OAWebBean webBean){ if (pageContext.getParameter("GoButton") != null) {   // The user pressed the "Go" button, do something... }}
登录后复制


访问根应用模块

OAPageContext缓存了根应用模块的引用,其可以提供对视图对象和事务的访问。如果你需要访问一个应用模块,可以像下面:

processFormRequest(OAPageContext pageContext, OAWebBean webBean){  OAApplicationModule am = (OAApplicationModule)pageContext.getRootApplicationModule();}
登录后复制


发出导航指令

你可以使用这个类的方法来告诉OAF框架来进行JSP转向或者一个客户端的重定向。比如(我们会在稍后的开发文档中对这个方法做更详细的介绍):

processFormRequest(OAPageContext pageContext, OAWebBean webBean){  if (pageContext.getParameter("CreateButton") != null)  {    // The user pressed the "Create Supplier" 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会话层Oracle EBS上下文信息,比如用户名称,id,当前职责等等。比如,下面的代码片段演示了如何获取用户名称:

processRequest(OAPageContext pageContext, OAWebBean webBean){  String userName = pageContext.getUserName();}
登录后复制


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在Word中复制页面 如何在Word中复制页面 Feb 20, 2024 am 10:09 AM

是否要复制MicrosoftWord中的页面,并保持格式不变?这是一个聪明的想法,因为当您想要创建特定文档布局或格式的多个副本时,在Word中复制页面可能是一种有用的节省时间的技术。本指南将逐步引导您在Word中复制页面的过程,无论是创建模板还是复制文档中的特定页面。这些简单的说明旨在帮助您轻松地重新制作页面,省去从头开始的麻烦。为什么要在MicrosoftWord中复制页面?在Word中复制页面非常有益的原因有以下几点:当您有一个具有特定布局或格式的文档要复制时。与从头开始重新创建整个页面不同

Stable Diffusion 3论文终于发布,架构细节大揭秘,对复现Sora有帮助? Stable Diffusion 3论文终于发布,架构细节大揭秘,对复现Sora有帮助? Mar 06, 2024 pm 05:34 PM

StableDiffusion3的论文终于来了!这个模型于两周前发布,采用了与Sora相同的DiT(DiffusionTransformer)架构,一经发布就引起了不小的轰动。与之前版本相比,StableDiffusion3生成的图质量有了显着提升,现在支持多主题提示,并且文字书写效果也得到了改善,不再出现乱码情况。 StabilityAI指出,StableDiffusion3是一个系列模型,其参数量从800M到8B不等。这一参数范围意味着该模型可以在许多便携设备上直接运行,从而显着降低了使用AI

自动驾驶与轨迹预测看这一篇就够了! 自动驾驶与轨迹预测看这一篇就够了! Feb 28, 2024 pm 07:20 PM

轨迹预测在自动驾驶中承担着重要的角色,自动驾驶轨迹预测是指通过分析车辆行驶过程中的各种数据,预测车辆未来的行驶轨迹。作为自动驾驶的核心模块,轨迹预测的质量对于下游的规划控制至关重要。轨迹预测任务技术栈丰富,需要熟悉自动驾驶动/静态感知、高精地图、车道线、神经网络架构(CNN&GNN&Transformer)技能等,入门难度很大!很多粉丝期望能够尽快上手轨迹预测,少踩坑,今天就为大家盘点下轨迹预测常见的一些问题和入门学习方法!入门相关知识1.预习的论文有没有切入顺序?A:先看survey,p

DualBEV:大幅超越BEVFormer、BEVDet4D,开卷! DualBEV:大幅超越BEVFormer、BEVDet4D,开卷! Mar 21, 2024 pm 05:21 PM

这篇论文探讨了在自动驾驶中,从不同视角(如透视图和鸟瞰图)准确检测物体的问题,特别是如何有效地从透视图(PV)到鸟瞰图(BEV)空间转换特征,这一转换是通过视觉转换(VT)模块实施的。现有的方法大致分为两种策略:2D到3D和3D到2D转换。2D到3D的方法通过预测深度概率来提升密集的2D特征,但深度预测的固有不确定性,尤其是在远处区域,可能会引入不准确性。而3D到2D的方法通常使用3D查询来采样2D特征,并通过Transformer学习3D和2D特征之间对应关系的注意力权重,这增加了计算和部署的

如何快速刷新网页? 如何快速刷新网页? Feb 18, 2024 pm 01:14 PM

页面刷新在我们日常的网络使用中非常常见,当我们访问一个网页后,有时候会遇到一些问题,比如网页加载不出来或者显示不正常等。这时候我们通常会选择刷新页面来解决问题,那么如何快速地刷新页面呢?下面我们就来探讨一下页面刷新的快捷键。页面刷新快捷键是一种通过键盘操作来快速刷新当前网页的方法。在不同的操作系统和浏览器中,页面刷新的快捷键可能有所不同。下面我们以常见的W

3秒跳转页面实现方法:PHP编程指南 3秒跳转页面实现方法:PHP编程指南 Mar 25, 2024 am 10:42 AM

标题:3秒跳转页面实现方法:PHP编程指南在网页开发中,页面跳转是常见的操作,一般情况下我们使用HTML中的meta标签或者JavaScript的方法进行页面跳转。不过,在某些特定的情况下,我们需要在服务器端进行页面跳转。本文将介绍如何使用PHP编程实现一个在3秒内自动跳转到指定页面的功能,同时会给出具体的代码示例。PHP实现页面跳转的基本原理PHP是一种在

重新排列、禁用和删除 iPhone 主屏幕页面的方法 重新排列、禁用和删除 iPhone 主屏幕页面的方法 Nov 29, 2023 am 08:22 AM

在iOS中,Apple允许您禁用iPhone上的单个主屏幕页面。还可以重新排列主屏幕页面的顺序,并直接删除页面,而不仅仅是禁用它们。这是它的工作原理。如何重新排列主屏幕页面触摸并按住主屏幕上的空格可进入抖动模式。轻点代表主屏幕页面的圆点行。在显示的主屏幕网格中,轻触并拖动页面以将其相对于其他页面重新排列。其他人会移动以响应您的拖拽动作。当您对新排列感到满意时,点击屏幕右上角的“完成”,然后再次点击“完成”以退出抖动模式。如何禁用或删除主屏幕页面触摸并按住主屏幕上的空格可进入抖动模式。轻点代表主屏

《我的世界》化身AI小镇,NPC居民角色扮演如同真人 《我的世界》化身AI小镇,NPC居民角色扮演如同真人 Jan 02, 2024 pm 06:25 PM

请留意,这个方块人正在紧锁眉头,思考着面前几位“不速之客”的身份。原来她陷入了危险境地,意识到这一点后,她迅速展开脑力搜索,寻找解决问题的策略。最终,她决定先逃离现场,然后尽快寻求帮助,并立即采取行动。与此同时,对面的人也在进行着与她相同的思考……在《我的世界》中出现了这样一个场景,所有的角色都由人工智能控制。他们每个人都有着独特的身份设定,比如之前提到的女孩就是一个年仅17岁但聪明勇敢的快递员。他们拥有记忆和思考能力,在这个以《我的世界》为背景的小镇中像人类一样生活。驱动他们的,是一款全新的、

See all articles