Oracle9iJDeveloper开发手册-构建J2EE应用程序.doc_第1页
Oracle9iJDeveloper开发手册-构建J2EE应用程序.doc_第2页
Oracle9iJDeveloper开发手册-构建J2EE应用程序.doc_第3页
Oracle9iJDeveloper开发手册-构建J2EE应用程序.doc_第4页
Oracle9iJDeveloper开发手册-构建J2EE应用程序.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第部分 概 述第1章 JDeveloper概述JDeveloper是一种用于Java编程的集成开发环境(IDE)。它为设计、开发、调试和部署所有类型的3GL Java及组成J2EE(Java 2 Platform,Enterprise Edition)战略的其他相关文件提供了相当丰富的特性。JDeveloper包括很多向导和代码生成器,可以简化Java的内部机制,使您能够将精力集中在用Java解决业务问题上。它还提供了强大的代码组织与配置管理功能。Oracle 9i版的JDeveloper与它的以前版本相比是一个巨大的飞跃。本章将从整体上介绍JDeveloper,展示其中各种各样的特性和功能。本章讨论JDeveloper的一个主要特性Java业务组件(Business Components for Java,BC4J),并概述如何用JDeveloper开发应用程序;还提供了一些简单的动手练习,以便您可以开始生成一些代码。有关BC4J的更详细信息将在本书的第部分介绍。第2章讲述了JDeveloper IDE本身由哪些组件构成。第3章讨论如何用IDE构建BC4J应用程序;对于Java初学者来说,第4章简要介绍了一些重要概念,要想更有效地使用JDeveloper,必须理解这些概念。第5章讨论了形成一致的命名约定的重要性,对于使用JDeveloper开发应用程序过程中需要用到的各种元素,都给出了如何为其命名的建议。用JDeveloper的调试特性进行调试的内容将在第6章讨论。第7章则概要描述了部署Java客户端(Java应用程序和applet)及JSP(Java Server Pages,Java服务器页面)应用程序的方法。最后,第8章着眼于9i版中的一个新特性:类建模器(Class Modeler),说明了如何运用这个工具协助进行应用程序开发。本书经常会提到创建“应用程序”,下面的说明框将帮助您弄清楚作者在本书中是如何使用这个词的。什么是应用程序在IT业界,很多人都会用到“应用程序”这个词。然而,在不同的环境中它可能代表完全不同的意思。一些人用“应用程序”表示整个计算机系统,其他人则用这个词表示整个计算机系统中的一部分,它在单个程序中物理地实现。在本书中,第2种定义将用来表示整个系统中的一个逻辑组成部分,通常是在单独的JDeveloper工作区内实现的。“应用程序”一词还有其他用法,如Java应用程序,这是与Java虚拟机(JVM)一起部署在客户端的一类Java程序,这类程序不需要浏览器的介入。本书中的“Java应用程序”仅指这类特定的程序。应用程序模块(Application Module)是一种BC4J组件,客户端程序可以通过它访问一组视图对象和视图链接。1.1 JDeveloper的过去、现在和未来JDeveloper的起源可追溯到1997年,当时Oracle公司从Borland International获得了基于Java的开发工具的许可,将这些开发工具与Oracle数据库、Internet及传统客户/服务器平台上的应用程序开发工具集成在一起。当时,Borland公司的JBuilder是十分强大的Java开发工具。Oracle购买了JBuilder的源代码,开始了其创建Java开发环境的历程。最初的JDeveloper 1.0(称为AppBuilder for Java)于1998年发布,它与其根基JBuilder非常相似。在1998年末,它被重命名为JDeveloper。这种最初的相似性一直持续到1999年发布的2.0版。从这些早期的版本中,可以看出这个工具是如何在Java环境中逐渐成熟的。虽然该产品的新版本仅表现出一些表面变化,但在幕后Oracle公司却在致力于完美地解决Java程序连接到关系数据库对象的问题。1.1.1 过去:产品的历史与起源JDeveloper 1.0和2.0版虽然都是很有用的Java开发产品,但如果要创建能与Oracle数据库交互的应用程序,它们提供的支持就太少了。公平地说,这也是由于当时的技术水平所限。辛勤的C+和Java程序员例行地担负起编写代码访问Oracle数据库的任务。然而,即便是对于掌握了一定技巧的程序员来说,这种编码工作也要花费大量的精力。因此,早期接受JDeveloper的人主要是这类Java开发人员,他们想寻求一种方法来创建与Oracle数据库交互的应用程序。而那些习惯于使用易于与数据库交互的产品、以及用Forms Developer等工具高效地创建应用程序的Oracle专业人员,并没有很快接受这一新产品。Oracle公司的项目战略并没有使情况变得简单。除了JDeveloper之外,Oracle公司还有一些产品可以让开发人员创建应用程序,并部署在Web上: Oracle Forms Developer(有时又称为Web Form)继续走向成熟。在9i版中,Web已经成为发布Oracle表单的惟一途径。该工具基于applet技术,而由于防火墙和性能的问题,这项技术在很大程度上已经被越来越多的Internet应用程序开发团体所抛弃。 PL/SQL Web Toolkit(mod_plsql)起源于早期版本的Oracle Application Server,Oracle Designer用它生成HTML客户端代码。PL/SQL Toolkit允许在数据库中编写可向浏览器输出HTML的PL/SQL。 PL/SQL Server Pages(PSP)允许在HTML内嵌入PL/SQL。PSP以一种类似于JSP的方式充分利用了服务器页面的概念。 Oracle Portal 最初被设计用来作为专门访问数据库的简单工具,在市场上称为WebDB。慢慢地,Portal演变成一种有用的Web站点开发工具。1. 为什么采用JDeveloper面对所有这些选择,为什么Oracle公司最终决定选择JDeveloper作为主要开发平台呢?这一决定表明了Oracle公司的长期发展规划。Oracle9i JDeveloper构建于J2EE之上。因此,JDeveloper与Oracle历史上的任何其他产品相比具有更强的基础。Oracle公司以前的所有产品都不得不在现有技术、向后兼容性及Oracle内部政策之间折衷。JDeveloper基于一种相对较新的技术,其他供应商为此技术提供大量支持,并有经过验证的标准做后盾。在JDeveloper从1.0版发展到9i版的过程中,Oracle公司在产品智能和体系结构基础方面投入的精力已经远远超过UI组件。甚至对于现在的9i版本来说,产品中的某些部分依然处于雏形阶段,主要的焦点都集中于创建一个能长期发展的牢固基础。2. 引入Java业务组件虽然这种长期的设计哲学从体系结构的观点来看是正确的,但是传统的Oracle开发社区成员却会因此感到沮丧,他们经常会因为在JDeveloper中开发应用程序过于低效而感到无耐。直到JDeveloper 3.0引入BC4J,Oracle构建Java应用程序访问Oracle数据库的方向才变得清晰。BC4J有助于自动实现大多数Java代码与关系数据库表交互时所必需的复杂工作。BC4J是支持Java与数据库交互的架构。BC4J向导能自动生成Java应用程序与数据库安全交互所需的代码,解决了以前开发中遇到的安全性、锁定及性能问题。BC4J生成的代码严重依赖于Oracle提供的一个Java库。因此,由BC4J向导生成的实际代码量是很小的。为了使开发人员能够创建包含用户界面的Java应用程序,Oracle提供了直接与BC4J生成的元素相联系的可选Swing组件的扩展,BC4J已经从概念上被证实是牢固可靠的,能够处理复杂的应用程序,而基于Sun公司的InfoBus(信息总线)体系结构构建的Data Aware组件已经被证明是有问题的。业界抛弃了InfoBus体系结构之后,Oracle公司也抛弃了所有InfoBus技术,以利于JDeveloper 9i支持Sun公司的模型-视图-控件器(Model-View-Controller,简称MVC)体系结构(在JDeveloper中实现为客户数据模型)。本章稍后将更加详细地介绍BC4J。同时,本书第部分将深入讨论BC4J的使用和结构。1.1.2 现在:JDeveloper的现状目前,JDeveloper中包含了非常稳定的Java业务组件,并且已经解决了9i版存在的许多v.3.2性能问题。MVC体系结构允许开发人员更有信心地创建访问Oracle数据库的Java应用程序或JSP。Oracle 9i JDeveloper提供了一种稳固的Java开发环境。在Web上搜索有关JDeveloper的文章就能发现,Java社团对JDeveloper有很多积极的评价。由于有了BC4J层,在编写与Oracle数据库交互的Java代码方面,JDeveloper就独占鳌头了。1. 创建JSP页JSP文件生成发送到客户端的HTML页。JSP文件被编译成servlet,这是一个纯Java程序。尽管大多数业务逻辑都可以用Java编写,但UI部分通常还是用HTML创建的。JDeveloper作为一种创建JSP页的Web应用程序开发工具,对于传统的已经习惯了Forms Developer那种一体化产品开发环境的Oracle开发人员来说,并不是一个完整的解决方案。在本书1 译者注:此处指本书的英文原版。编写之际,JDeveloper对于HTML页可视化设计的支持与Microsoft公司的Frontpage等工具相比,依然十分有限。对代码高亮显示、代码自动补全、结构化显示及调试等的支持非常完整,这也就是对JDeveloper中运行和调试JSP代码所提供的支持。当前使用Forms Developer和PL/SQL的开发人员不能简单地用JDeveloper和Java替代原来的方法来创建部署在Web上的复杂客户/服务器应用程序。构建具有完整功能的允许用户安全高效地与数据库交互的Web应用程序是一项极为复杂的任务。这些内容将在第7章中详细介绍。2. 创建Java应用程序部署在客户/服务器或者Intranet环境中的Java应用程序的开发情况,与部署JSP页的情况有很大的差别,因为JDeveloper对Java应用程序的开发提供完整的支持,包括可视化编辑及在表单风格的界面里设置属性等。与使用Forms Developer等产品相比,使用JDeveloper可以创建同等甚至更复杂或高级的应用程序。然而,用JDeveloper创建应用程序的速度无法像用Forms Developer一样快。JDeveloper向导还不够成熟,作为一种RAD开发工具,JDeveloper还不足以与Forms Developer有效地竞争。虽然Forms Developer是一种真正的4GL,其中对象的属性都存储在一个内部资料档案库中,而JDeveloper实际上是一个代码生成器与组织器。尽管您可以像在4GL环境中那样与JDeveloper向导和IDE交互,但是实际上是在创建Java代码。应用程序开发过程经常会超出JDeveloper向导的能力,必须手动修改向导生成的属性,或是添加向导未生成的代码。1.1.3 将来:远景展望从9i版中可以看出,Oracle公司对JDeveloper寄与了很大的期望,表明这个版本比以前版本的范围要广泛得多。对统一建模语言(Unified Modeling Language,UML)图表的有限使用、功能完备的软件配置管理(SCM)资料档案库,以及生成数据定义语言(Data Definition Language,DDL)的能力都表明了Oracle公司对这个产品的长期发展思路。最终目标为所有Oracle系统形成一个单一的集成开发环境。数据库和应用程序的设计、创建及维护都可以用一个产品来处理。也许JDeveloper最终会将其他产品的功能包括进来,如Oracle Designer、Oracle Forms Developer及一些第三方产品(如Quest软件公司(Quest Software)的TOAD或SQL Navigator)。这些目标的最终实现还需要几年的时间。当Oracle公司将这种期望变成现实时,Oracle专业人员将拥有梦寐以求的集成设计开发环境。短期前景与长期前景JDeveloper的短期和长期发展前景会如何?在短期内,Oracle有理由对该产品的核心体系结构感到满意。目前,他们正致力于改进产品的应用程序开发效率。未来JDeveloper的发展,最终可能实现改良过的向导,以帮助将目前开发应用程序所需执行的任务实现自动化,也有助于缩小JDeveloper和Forms Developer之间在开发企业内部应用程序上的差距。第二个短期改进会集中在把JDeveloper作为一种建模和设计工具上。当前的类建模器反映了Oracle在使用UML设计数据库方面的兴趣。到2003年底,JDeveloper作为一种数据建模工具,将会与Designer形成有效竞争。为了支持软件开发周期中更多的内容,UML的其他部分也会合并到JDeveloper中。用例(用于描述业务需求的UML格式)也将包括进来,以便支持分析过程。如前所述,长期目标显然是向一种“一站式”开发环境转变。为满足建立Oracle系统时遇到的不断变化的设计和开发任务,新的特性正在系统地、从容不迫地加入到JDeveloper中。1.2 Java业务组件与其他Java开发工具相比,JDeveloper的主要优势在于它的Java(BC4J)业务组件架构及相关的代码生成器。BC4J是JDeveloper产品的核心,正是它使建立Java或基于Web的应用程序的Oracle开发人员对JDeveloper情有独钟。BC4J的根基是一种编程协议或标准,它们描述了如何构建与关系数据库交互的类。JDeveloper用BC4J作为处理数据库DML操作(查询、插入、更新及删除)的主要方式。在BC4J及类似产品出现之前,将基于Java的应用程序连接到数据库是一项异常困难的任务。为了使Java前端与数据库协调工作,必须编写复杂的JDBC(Java Database Connectivity)和/或在Java中嵌入SQL代码(SQLJ)。除此之外,还必须维护自己的数据缓存,批处理自己的更新,并跟踪表的锁定与提交。这种与数据库之间的复杂接口被证明是创建基于Web应用程序的最大障碍。那些尝试过开发应用程序的组织,如果没有使用JDeveloper这样的工具,经常会超出预算,并且开发出来的应用程序也难于维护。JDeveloper中的BC4J组件提供了到数据库的功能接口,并且可以使用内置的代码生成器或向导来构造这些组件。本章仅仅从总体上介绍一下BC4J组件。本书的第部分会深入讨论BC4J,该部分及其他几章中的动手练习展示了BC4J组件应该如何与Swing组件、JSP应用程序及其他JDeveloper生成的代码结合使用。1.2.1 Java与XMLBC4J组件是Java与XML相结合的产物。XML与Java都是开放源代码的(非专有的)语言。由于这两种语言都与操作系统和平台无关,所以它们可以通过网络进行很好的交互,也可以跨Web进行操作。这两种语言都具有互为补充的独特优势。Java是一种模块化、可移植的语言,鉴于其内在的安全性和支持Internet的能力,它是一种业务应用程序之间进行通信的理想机制。然而,Java缺乏在不同平台和应用程序之间交换数据的有效方法,这一点正是可扩展标记语言(Extensible Markup Language,XML)的长处。XML是一种与HTML类似的标签或标记语言;不过XML的标记功能更加强大,因为可以对它的基本标记进行扩展,以满足不断发展的需要。HTML用标记来描述希望的显示方式;而XML创建标记的目的是用来描述文本或数据的结构和内容。应该注意到,XML和Java一样,是区分大小写的语言。XML用于定义数据,而Java用于对数据进行操作。您将会发现,BC4J组件包含了与之相关联的XML和Java文件。XML文件存放了定义该业务组件的元数据,而Java文件存放了实现业务组件的方法。Java文件中包括了get ( )和set ( )方法,可以在运行时动态生成插入、更新和删除语句。而且,XML和Java文件中不但可以包含数据库表引用,还可以包含更多信息。它们也可以定义和实现验证规则。1.2.2 BC4J结构BC4J是JDeveloper中一种结构很好的、经过仔细设计的组件。由于BC4J向导仅提供了修改底层Java类和XML文档的简单机制,所以只有高级JDeveloper用户才知道底层结构的细节。从开发人员的角度看,您只需使用BC4J逻辑对象概念考虑问题。只有在需要编写超出向导处理能力的复杂验证或编码功能时,才会操作Java类。BC4J组件可以从概念上将应用程序分为两个主要部分,如图1-1所示。 用户界面和客户端逻辑 数据库接口和业务逻辑图 1-1使用这种面向对象的架构可以帮助您创建可重用的业务组件,在数据库和用户界面(User Interface,UI)之间实现有效的通信。BC4J向导读取Oracle系统视图,获取代表数据库结构的元数据。使用这个元数据,向导可以生成XML和Java代码,从而提供一个可以定制的架构,您可以向该架构添加数据验证器以及其他业务逻辑。BC4J组件提供了很多好处。首先,使用这些组件可以更容易实现简单性和组织性。在应用程序中包含一个BC4J项目,意味着您可以根据BC4J组件的部署位置,来优化代码的整体性能和可重用性。其次,可以将数据验证这类共享代码移到BC4J层,这样就改善了代码的可维护性。再次,BC4J类可以部署在数据库服务器、应用程序服务器或本地客户端。对于那些对验证需求强烈的应用程序而言,这种可移植性将会使它们获的重大的性能改进。BC4J使Java应用程序能够容易地与关系数据库通信。通过与BC4J向导交互,您可以生成XML文件和Java类。应用程序开发人员随后可以编写Java代码,与BC4J生成的处理与数据通信的类进行交互。生成的这些类能够正常工作,这是因为Oracle提供的Java类库中包含了所有复杂的数据库交互例程。在BC4J出现之前,编写Java应用程序来与关系数据库通信是一项异常复杂的任务,超出了大多数开发人员的技能水平。少数勇敢的先锋曾尝试自己完成这项任务,现在,该任务变得如此简单,他们会十分高兴的。1.2.3 BC4J组件BC4J组件分为3个主要部分:数据定义和验证组件、数据操作和过滤组件以及存储位置和容器。对于熟悉数据建模的读者来说,图1-2有助于您理解与每个BC4J组件关联的关系和基数(cardinality)。如果对UML建模不熟悉,可以简单地将这些图看作表示BC4J层中总体关系的框图(附录C会介绍这种UML图中使用的符号)。这个信息有助于可视化这些组件如何彼此相关,以及它们如何被组织为组。图 1-21. 数据定义和验证组件下面介绍数据定义和验证用到的组件: 实体对象(Entity Object) 实体对象基于数据库表、视图、图或同义词,并且包括数据库存储需求。实体对象可以从已有的数据库对象生成,也可以手工定义,并以此创建新的数据库表。实体对象包含属性(列)定义。 属性(Attribute) 属性有两类:实体属性和视图属性。实体属性是实体对象的一部分,通常对应于表的列,可能包含验证规则和业务逻辑。有些属性不能查询,如BLOB类型,应该在实体对象向导(Entity Object Wizard)中取消选中Queriable复选框。视图属性不过是实体属性的一种。可以为计算列(calculated columns)等项创建额外的视图属性。 关联(Association) 关联定义了一对实体对象之间的关系。典型的关联表示数据库中的外键约束,但是在任意一对实体对象属性组件之间都可以定义关联。还可以在关联的每一端指定多个属性,只要双方都有同样数目的属性即可。关联是双向的。 域(Domain) 域是用户自定义类型,表示一个属性可以具有的值的类型。例如,您可以创建一个域,以保证输入的社会保险号确实是9位数字。当您为该组件编写验证逻辑时,必须将逻辑放入一个名为validate( )的方法中,这个方法会被该域的Java文件的构造函数调用。每次用这个域实例化一个新对象时,构造函数就会调用validate ( )方法,以确保新增加的属性满足您定义的准则。 特性(Property) 在BC4J组件的概念中,特性是一个字符串类型的名/值对。特性用于存储字符串文本。这些文本串可以在运行时显示信息,例如,定义某个用户的访问等级,指定使用哪一种类型的UI控件,以及设置域的格式掩码。您可以为域、实体对象、视图对象、实体属性、视图属性及应用程序模块定义特性。BC4J特性存储在相关联的组件的XML文件中。2. 数据操作或过滤组件视图对象和视图链接通过对实体对象定义的数据进行过滤,提供适当的数据来支持UI。 视图对象(View Object)。视图对象用SQL查询对实体对象所定义的数据进行指定和过滤。客户端应用程序通过视图对象的get( )和set( ) 方法可以实现导航、更新、插入和删除数据的操作。 视图链接(View Link)。视图链接用于表示视图对象之间的关系。这些关系仅仅在一个方向上实现。因此,在一个主从关系(主对象是源,从对象是目标)中,只有源对象定义了get/set的访问方法。对于主表中当前选中的行,视图链接为详细表提供过滤后的行。视图链接将视图对象链接起来的方式与关联链接实体对象的方式相同。不过,在视图链接和关联之间没有程序性的联系。关联可以用于生成视图链接,视图链接也可以独立于关联创建。3. 存储位置和容器BC4J层中用来放置元素的位置/容器有两种: 包(package)。Java类是通过包中的目录来分组的。在开发期间,这些包等价于存储源代码的硬盘上的子目录或文件夹。 应用程序模块(application module)。应用程序模块定义了BC4J视图对象和视图链接,客户端应用程序将与这些组件进行交互。在同一个BC4J层中可能有多个应用程序模块。也可以在一个应用程序模块中嵌入其他应用程序模块。您也许会想在一个特定的应用程序屏幕或任务中用多个应用程序模块实现业务逻辑,为每一部分逻辑提供它自己的模块。典型的情况是,一个应用程序模块中可能包含34个视图对象和链接,甚至可能更多。一个大的应用程序可能包含20个或更多的应用程序模块,其中每个模块都包含与给定任务对应的适当视图对象和视图链接。1.2.4 BC4J逻辑体系结构从逻辑上讲,用BC4J创建的对象可分为两类:数据库接口对象与应用程序端对象。在数据库端,BC4J包括了实体对象和关联。应用程序端对象则包括视图对象、视图链接及应用程序模块。1. 实体对象及关联实体对象及关联多多少少都和表及外键约束相对应。不过,并不是必须像构造表那样来构造实体对象。如果是初次使用BC4J,可以创建只是表的映像的默认实体对象。默认关联将根据数据库中的外键约束来生成,以便您最终就可以在BC4J层得到数据库的精确映像。不过,实体对象并不一定非要构造得像底层数据库表。这两者可以在以下方面有所区别: 您可以定义实体对象,但并不一定表示表中的全部字段。如果开发人员永远不会使用CREATED_DATE、CREATED_BY、MODIFIED_DATA及MODIFIED_BY等字段,就没有理由在应用程序中理会这些字段。而且,如果数据库中存在非常宽(字段很多)的表,那么在BC4J层中包含所有这些字段将会使实体对象变得很难操作。 有些字段可以在实体对象中存在,但不在数据库中存在。例如,在交易清单明细中用TOTAL字段表示数量和价格的乘积;或者显示与表相关联的函数,例如,为了显示的方便,在EMP表中将名和姓连接在一起作为显示名称。这使开发人员在想显示特定的雇员记录时只要访问属性即可,不用每一名开发人员都去决定显示记录时该用哪一个字段。 您可以定义更新不同数据库字段的实体属性。这可以简单到将一个现有的字段重命名,这可以使数据库更清晰或更混乱,也可以用来简化开发环境。例如,“生日”和“年龄”等BC4J实体属性可以结合使用,以填充物理数据库中的“出生日期”字段。 您可以在实体对象中执行额外的验证操作。为了实现这一点,可以将业务逻辑从关系数据库复制到BC4J层中,以支持CHECK约束或基于触发器的验证。甚至可以在BC4J层中添加额外的验证,但使用的时候要多加小心。如果任何验证规则仅存在于实体对象中,而不存在于数据库中,那么只要应用程序绕过了BC4J层,就可以绕过其中包含的任何验证。 定义的实体对象的行为可以与具有INSTEAD OF触发器的视图类似。可以绕过标准的INSERT、UPDATE以及DELETE逻辑,转而执行所期望的代码。不过,对于这类BC4J视图对象,也得同样小心:直接访问表的应用程序将会绕过数据库视图中的触发器代码。 实体对象不必一定与某个表关联。实体对象可以是完全由人工构造,从开发人员角度看,实体对象就像一个表,但是与之交互的可以是替代数据源、普通文件或者与应用程序完全处于同一位置的Java代码。正如实体对象通常是根据关系数据库中的表生成那样,关联通常根据外键约束生成。然而,BC4J中的关联可以与数据库中的参照完整性约束不同。您可以将关联的基数改为与在数据库中的不同,不过请记住,即便是BC4J层接纳了数据,BC4J规则也永远不能削弱底层数据库的规则;只能增强这些规则。您也可以创建在数据库中不存在底层外键约束的BC4J关联。2. 抽象层实体对象与关联就是开发人员对物理数据库的看法。如前所述,这种理解可能和实际的物理数据库不同。因此,实体对象是开发人员和数据库之间的一个抽象层。抽象层还存在一些细微的局限性。实体对象永远也不能直接指向多个表或视图。这并不是说实体对象不能与数据库中的多个表或者视图进行交互。如前所述,这实际上可以用两种不同的方式实现: 可以覆盖某个实体对象默认的INSERT、UPDATE和DELETE行为,让它完成更复杂的事情。 可以使用包含INSTEAD OF 触发器的数据库视图。这种策略允许能查询任意数目表的复杂视图,并用INSTEAD OF插入、更新和删除触发器,实现任何需要的行为。使用实体对象及关联,Oracle已经有效地再现了常有INSTEAD OF触发器的数据库视图所提供的能力。您冒着风险把代码放到可能被绕过的地方,而没有把代码放在数据库中;如果把代码放在数据库中,那么在不同的平台和工具下无需重写代码就可以实现重用。而且,作为设计人员,如果选择BC4J作为放置业务逻辑的地方,就是在染指产品的体系结构。那么为什么还会有人不想把实体对象做成底层表或者视图的精确映像呢?这样做的原因如下: 改善性能。您可以选择BC4J层作为放置验证规则的地方,这样可以改善性能。对于有些应用程序,在数据库层实现代码要求在网络上传输消息,而在业务逻辑层实现则可能极大地提高性能。 支持超负荷的表。可以将多个实体对象指向同一张表。这使开发人员可以支持包含超负荷表的抽象数据模型。例如,如果用典型的单表方式实现雇员超类,它包含薪水工及小时工两个子类,会得到一个单一的雇员表,其中包含一个类型字段。按小时计酬的雇员和领薪水的雇员都保存在一张表里。在BC4J中,可以为领薪水的雇员和按小时计酬的雇员创建相互独立的实体对象,其中每种对象的属性都指向相应的字段。然而,数据库中的视图可以简单地完成同样的功能。实体对象层仍然是在数据库之上的另外一层抽象。但是,应用程序并不与这一层直接进行交互。在实体对象和关联之上还存在一个抽象层,称为视图对象和视图链接。3. 视图对象与视图链接视图对象和视图链接可能分别对应于实体对象和关联。但视图对象能实现更多功能。当您运行BC4J向导并接受默认设置时,在视图对象与实体对象,以及视图链接与关联之间存在一对一的对应关系。然而,正如实体对象和关联不必与表和外键约束完全相同一样,视图对象和视图链接也不必完全对应于实体对象和约束。实际上,视图对象与实体对象之间连接的紧密程度甚至比实体对象与表之间的紧密程度还要低。视图对象的主要特征是:它们正是支持应用程序所需要的数据。视图对象是用于访问关系表的一个简单查询。视图对象与实体对象之间的关系可以是多对多的。视图链接是指视图对象之间的关系。还可以使用视图对象的结构直接与表或其他数据结构进行交互,而不是使用实体对象。只要代码的行为合理,视图对象并不必一定与外部数据容器交互。实体对象所的所有灵活性都可以同样适用于视图对象。您可以显示属性、计算属性等,还可以在视图对象中放置验证逻辑;然而,验证逻辑通常应该放在数据库和/或实体对象中,因为那些位置更加集中。您也会考虑在视图对象中加入验证逻辑,以便强制实现特定应用程序的验证规则。4. 应用程序模块视图对象和视图链接都用于名为应用程序模块的集合中。为了支持主从式(master-detail)2 译者注:有些地方称为主细表关系,本书中统一称为主从表关系。的应用程序,您必须在创建应用程序模块之前设置主从视图链接。应用程序模块还包含了访问数据时需要用到的数据库连接定义。1.2.5 使用BC4J当您创建特定应用程序的BC4J时,就是在建立一组Java类,其中包装了DML命令和存储数据结构定义的XML文档的引用。这些Java类扩展了基本的BC4J类库,向数据库发出JDBC调用,接管所有的插入、更新、删除和加锁功能请求,以使应用程序运行。这使您能够将与数据库访问有关的逻辑完全封装起来。它为开发人员提供了一种开发应用程序的简单方式,像Oracle Forms Developer那样在表之上搭建模块。然而,BC4J的功能远远不止于此。复杂的验证通常是在数据库中实现的,比如在表或者视图上创建INSTEAD OF触发器。INSTEAD OF触发器视图是一种Oracle视图,它使用用户提供的触发器代替默认的插入、更新和删除行为。在BC4J类中也可以实现复杂的数据验证。除了这个额外的选项之外,还是很难制定出准则,告诉人们什么情况下把数据验证逻辑放在数据库中,什么情况下又该把验证逻辑放在BC4J组件中。在一个非纯Java的环境中,将验证逻辑放在BC4J组件中可能会很危险。一些应用程序会通过BC4J访问验证,而另一些在其他产品中编写的应用程序可能无法通过BC4J访问验证逻辑。如果您正在工作的环境是完全基于Java的,那么用JDeveloper创建和操作BC4J组件就会十分简单,您完全可以选择用BC4J实现服务器端的验证,因为减少开发时间就意味着降低成本。然而,只有保证所有涉及数据更改的DML操作都使用BC4J组件,才能说这种操作是合适的。BC4J类还能够缓存数据,供多个用户共享,由于这样做不用再访问数据库,因此会提高性能。1.2.6 使用BC4J的方法使用Oracle 9i JDeveloper和J2EE,就可以使用多种方法建立应用程序。现在,系统业务规则可以在以下的任何地方驻留: 核心数据库过程和触发器 带INSTEAD OF触发器的数据库视图 BC4J实体对象及关联 BC4J视图对象及视图链接 应用程序逻辑如何在应用程序中使用BC4J可以有多种思路。业务规则不应该放在应用程序逻辑或视图对象中。之所以在此处给出这两项,是因为业务逻辑的确可以在这些地方驻留。有人声称所有的业务逻辑都应该放在数据库中,应用程序根据需要使用其中的一个子集。又有人说实际上所有的业务逻辑都应该存储在BC4J层,这样数据库就只是作为一个永久存储类中数据副本的地方。每一种策略的拥护者都以极大的韧性坚持着自己的开发风格。本节将讨论这两种方法的优缺点。要记住,这些方法都依赖于JDeveloper对它们的支持能力。由于JDeveloper的功能在不断扩展和进化,因此这些优缺点也可能发生转变,现在几乎无法实现的方法在将来发布的版本中也许会变得更加可行。1. 以数据库为中心的方法以数据库为中心的方法假设您一开始就具有一个功能完整的Oracle数据库。当进行应用程序的逻辑设计时,很明显,如果将数据库视图和用户界面元素对应起来实现会更加简单。创建这些视图时应该使用INSTEAD OF 触发器,这样就可以支持插入、更新和删除功能。视图对象中显示的所有字段都是数据库视图中的列。对于每一个程序来说,都要创建一个小BC4J项目,其中包含实体对象和关联,它们与创建程序必需的表、视图、外键约束之间存在一对一关系。接下来,要为每一个实体对象和关联创建默认的视图对象和视图链接。然后将这些组装成一个应用程序模块,用来支持前端程序。因为所有的业务逻辑都在数据库内部验证,所以只有需要增强性能时才会把验证逻辑加进实体对象中。很少会发生向实体对象或视图对象中添加额外属性的情况,这是由于这些属性已经包含在数据库中的基础视图里面了。每个程序都有自己的BC4J项目。BC4J项目不会被其他程序共享。应用程序模块相对较小,其作用范围与Oracle Forms Developer文件差不多,可能稍有区别。以数据库为中心方法的优点 用以数据库为中心的方法构建应用程序具有如下优点: 这种方法对于现有的Oracle开发人员来说是感觉最舒服的。它基本上使用相同的逻辑为Oracle数据库创建前端程序。 这种系统不会紧密依赖于单一的产品(BC4J)。大部分非UI代码都位于数据库中。例如,由于所有的业务规则都放在数据库中,所以不访问BC4J层的程序也会使用数据库中的代码。 BC4J上几乎所有的工作都可以通过JDeveloper向导来完成。需要手工编程的工作几乎没有。应用程序模块的BC4J项目只需花几个小时甚至更少时间就可以完成,因为您只需为每一个数据库视图给出一个默认的实体对象定义即可。以数据库为中心方法的缺点 下面是用以数据库为中心的方法构建应用程序的一些缺点: 这种方法忽视了BC4J提供的所有功能和灵活性。有了实体对象和视图对象,在该开发策略中未使用的数据库顶端就有了两个新的抽象层,而这种方法没有利用这两层。 这种方法不支持BC4J的重用。BC4J体系结构的一个关键要素就是建立与重用BC4J项目的能力。 没有充分利用BC4J缓冲的优势。这也是BC4J的主要优势之一,因为它可以将数据库的活动卸载到其他地方,以节省数据库服务器的CPU周期,完成主要目标:管理数据。这样减少了网络上的消息数目,如果所请求的数据已经提供过了,那么对数据库活动的需求也会减少。 没有利用BC4J对于Web层和业务层服务器的支持。BC4J支持J2EE的概念:认为将一部分应用程序代码分离到另外一台服务器上是有好处的。如果要求数据库处理应用程序的代码,那么为了处理复杂的业务逻辑,数据库完成其主要目标的效率必然会打折扣。 应用程序严重依赖于Oracle DBMS中带INSTEAD OF触发器的视图。除非其他数据库也提供与带INSTEAD OF触发器的视图类似的结构,否则就无法用这种方法创建跨数据库的应用程序。 需要有才干的PL/SQL开发人员。如果您公司的主要开发环境是Java,那么这种方法简直毫无意义。2. 业务逻辑层方法业务逻辑层方法一开始也假设您有一个功能完备的Oracle数据库。这种方法与前一种方法的主要区别在于,业务逻辑包含在位于数据库之外的Java类文件中。在极端情况下,这种方法意味着只需创建一个BC4J包(其中包含实体对象与关联)来支持整个企业的数据模型。对数据库中的每一张表,都创建一个实体对象。然后,我们就可以根据程序需要的结构,创建单独的项目,其中包含视图对象、视图链接和应用程序模块。接着,为每一个程序构建一个BC4J应用程序模块。这样就将业务规则添加到实体对象中,为了增强健壮性,也可以在数据库中重复定义业务规则。在一个大规模的企业级数据模型中,可能要将根据数据库创建的实体对象和关联划分成更小的子集,以使在设计时处理起来更容易。例如,一个有300张表的系统对应着300个实体对象,那么可以将其划分成大约10个应用程序模块,大概每30张表为一个应用程序模块。如果一组表之间有很多关系,这些表就应该放在同一个包内,然后用关联表示这些关系。跨包的关系应该用同一包内的关联表示为视图对象、视图链接及使用它们的应用程序模块。然后这个实体项目就可以共享了。如前所述,视图对象不仅仅是实体对象的默认映像,它通常会从多个实体对象中同步地搜集信息。实际上,视图对象根本不必基于实体对象,而是可以直接将数据库的数据缓存在自身中。更多相关信息请参看第13章。一个实体对象和关联可以被很多(520个)不同的包共享,这些包里还包含其他的关联、视图对象、视图链接及应用程序模块。简单的程序通常是一个程序只有一个应用程序模块,但一个程序也可以包含多个应用程序模块,两个能完成类似任务的程序使用同一个应用程序模块也很正常。采用这种方法后,验证逻辑可以存在于BC4J层中,也可存在于数据库中。业务逻辑层方法的优点 采用这种方法具有如下的优点: BC4J缓存、项目重用、以及相对于数据库的独立性是该方法的用武之地。 如果正确使用这种方法,可以达到最大的开发效率。这是因为持久化层和业务逻辑层的模块化程度增强了。 您可以借用BC4J的能力从数据库服务器上卸载活动。这一优势也正是前一种方法的弱项。业务逻辑层方法的缺点 下面是这种方法的一些缺点: 从概念上来讲,这种方法比较难于实现,因为系统的业务规则可能存在于不同的地方。例如,这些规则可能存在于表、实体对象或视图对象中。必须为使用不同的代码位置开发出一套标准和准则,并强制执行。 采用这种策略的组织应该仔细地将这些规则形式化。规则适用于数据库、实体对象及视图对象。它们必需回答“对象是如何组织的?对象之间如何交互?”等问题。 如果没有仔细进行规划,那么BC4J提供的灵活性可能会导致系统中充满难以跟踪的bug。这是因为许多地方都可能出现逻辑错误。设计良好的错误信息有助于减少这一问题。1.2.7 用BC4J创建应用程序您可以将用户界面连接到BC4J对象上,从而迅速建立完整的应用程序。过去,即便是完成最简单的事务,客户端和服务器之间也要进行多次通信。然而,在如今的Web和广域网中,这种在系统中存在大量传输的风格已经行不通了。BC4J组件解决这种问题的办法是,为传统的客户端/服务器逻辑提供不同的实现地点,结果是使业务逻辑和数据验证代码中的数据路径变得更短。使用BC4J就好像在临近客户端应用程序的地方出现了一个虚拟数据库(包括表、列、同义词和元数据)。您可以将BC4J简单地想象成一个黑盒数据库。它可以和一个或更多客户端进行交互,同步数据,管理缓冲区,并实现数据模型的基本功能。研究一下BC4J组件的可扩展性,就会意识到它们除了充当虚拟资料档案库的角色之外,还可以提供更多的功能。BC4J通过包含复杂业务逻辑这种元素,提供了一种可扩展的架构,使您能够远远超越传统的关系数据库结构。例如,无需采用BEFORE INSERT触发器就可以实现逻辑“或”的约束关系。只要增加一点儿代码,再充分利用部署选项,您就可以优化系统的整体性能。实际上,每个应用程序都需要对基本的BC4J组件进行一些修改。因此,理解BC4J组件是如何设计的及如何使用BC4J的接口非常重要。1.3 在JDeveloper中创建应用程序代码JDeveloper是一个应用程序开发工具,可以帮助您迈出Java世界中的第一步。它既可以像一张白纸,所有复杂的文章都由您自己来书写;也可以给那些喜欢用4GL的拖放技术开发应用程序的人用做代码生成器。JDeveloper还可以自动生成基本的数据库接口代码,允许您定制出满足需要的结果。理解Java和JDeveloper,就如同同时学习英语和一个计算机字处理程序。在您投入精力做这种事情之前,应该对其他的计算机语言和应用程序开发模式有一定的经验。最好是在阅读本章的同时,实际创建一下本书动手练习里面介绍的那些项(item)和结构(structure)。这样,您在尝试编写真正代码时就可以迅速了解开发环境。传统环境和JDeveloper环境的主要区别是:在有些开发环境中,用户界面和它与数据库之间的交互是不可分离的。在JDeveloper中,您可以在称为项目(project)的逻辑容器中创建文件。每个程序通常由两种类型的JDeveloper项目组成: Java业务组件 使用Java和XML建立及编写,提供与数据库交互的组件。 用户界面组件与逻辑 主要由Java及与Java相关的语言建立和编写。JDeveloper为协助您产生多层体系结构的数据库应用程序进行了优化。在JDeveloper背后,生成多层应用程序的功能集中在BC4J上。多层体系结构提倡从逻辑上划分出下列元素: 客户层 客户层支持终端用户对数据访问的需求。对于复杂的GUI,可以在Internet上通过浏览器的脚本处理能力运行应用程序代码,也可以在客户端的桌面上安装应用程序代码,并从浏览器之外运行它。 应用程序层 应用程序层一般要强制实现业务逻辑,并对数据访问进行调整。应用程序服务器上包含的业务逻辑可以被多种客户端及应用程序重用,这样就可能实现跨越多层体系结构的物理和逻辑资源共享。应用程序层还可以包含专门的报表和分析工具,以便处理复杂的业务智能需求。另外,应用程序层(包含J2EE体系结构中的Web层和业务层)还能够提供在浏览器中显示的HTML用户界面代码。 数据库层 数据库层是存储及查询数据的地方。这一层中也可以包含一些链接,指向其他外部数据源和应用程序,这些应用程序也可能是组成整个体系结构的成员。下面几小节介绍了JDeveloper用于支持应用程序的代码构造和组织方式。1.3.1 工作空间工作空间(workspace)是JDeveloper中最高级别的容器。除了连接之外的全部代码都必须包含在某个工作空间中。工作空间在大小和范围上大概与Forms Developer中的一个.fmb文件相对应。每个工作空间都由一个扩展名为.jws的文件实现。这是一个XML文件,其中包含了组成这个工作空间的项目文件。工作空间文件包含了一些指针,指向组成它的项目文件。1.3.2 项目项目(project)是JDeveloper中下一个级别的容器,包含代码文件。您可以将项目看作是应用程序的主要部分。典型的情况下,应用程序被划分为两个项目

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论