小编说:Oracle EBS(E-Business Suite)是甲骨文公司的一套大型ERP应用产品,在这套产品中,大量的功能实现都基于Oracle的Form表单。本文作者将从原理、基础、实战三个方面由浅入深地带领读者学会Form开发。 本文选自《深入浅出Oracle 之Form开发》。
虽然我们在设计Form、编写PL/SQL代码的时候,感觉不到Java的影子,但在执行时,其确确实实被转化为Java Applet在Jinitiator这个JVM中运行,我们在块中创建的Item,其实际也对应一个个Java类,看下表中的类列表,应该知道分别对应Form中的哪些Item。
注意:这些类在应用服务器的$ORACLE_HOME/forms/java下面。
在Forms Builder中,Item中有一个“Implementation Class”属性,其用来指定一个Item到底继承自上表的哪个Java类。标准的Item,其Implementation Class都置空,无须明确指定,因为Oracle内置了对应关系。
但如果要在Form中使用非标准的类,比如我们自行扩展的,则必须明确设置Item的“Implementation Class”属性,并且是带包名的全称,如cux.TextReader。
一个类要在Form中使用,其必须符合Oracle Form的设计规范,简单地说,就是要实现oracle.forms.ui.IView接口。上述的VXXX类无一例外都继承了IView。
Oracle还提供了实现IView接口的VBean类,如果用户欲创建的类不需要从其他类继承,则可以直接继承VBean,省略麻烦的IView实现。
注意:如要加深理解或者遇到问题,可反编译VBean类来看个究竟。
在Form开发中,我们已经习惯于按如下步骤来开发一个标准Item。
(1)通过属性面板设置属性。
(2)在代码中调用set_item_property或者get_item_property。
(3)编写Item的触发器。
(4)于是某个事件发生时会触发(3)的代码。
这些人性化的方式,后台是Oralce的自动转换:
(1)初始化Item时,调用setter函数。
(2)调用setter函数、调用getter函数。
(3)初始化Item时,调用addListener添加对应事件的侦听函数——我们写的代码。
(4)Java类Raise事件,并根据定义的Listener调用相应的代码。
对于自定义的类,Oracle仅提供如下两种沟通方式:
Form中仅能调用set_custom_property、get_custom_property两个内置函数;后台Oracle将其转换为调用Class的setter、getter函数。
Java类中可以任意抛出一个事件,包含事件名称和参数;Form中统一通过when-custom-item-event进行处理,事件名称保存在:system.custom_item_event中,参数保存在:system.custom_item_event_parameters中。
注意:参数是什么?是不是类的所有属性及其当前值?读者可以深入思考。
在Jinitiator中运行的Form,基于Java的安全设计,“标准”功能无法操作客户端,如果有此需求,可通过自定义Java类的方式实现。
要在Form中使用一个自定义的Java类,那么按照上面的分析,结合Applet的安全性,应该这样:
(1)根据需要,编写实现IView的类,或者简单地继承VBean,编写需要的代码。
(2)上传至Forms Server,并包含在CLASS_PATH中。
(3)如果需要操作客户端文件,则需额外完成认证。
(4)Form中创建Item,类型为BeanArea,且Implementation Class需明确设置。
仍然站在普通的Form开发角度来理解,那么该如何开发这个Item?
(1)编写when-custom-item-event,并根据:system.custom_item_event做出不同的处理,如果需要参数,用Form的两个内置函数get_parameter_list、get_parameter_attr从:system.custom_item_event_parameters 中获取。当然编写者需事先知道类会抛出哪些事件,其参数分别是什么。
(2)任何时候,都可以调用set_custom_property、get_custom_property,至于Class中的setter、getter,实际上可以实现任何逻辑,而不是通常所理解的设置属性、获得属性,比如可以通过它们打开本地的文件、读取文件、执行本地命令、设置可见Class的背景等。
本文分享自 博文视点Broadview 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!