基于设计模式的数据访问研究与应用

基于设计模式的数据访问研究与应用

ID:32511268

大小:590.94 KB

页数:57页

时间:2019-02-10

上传者:U-22107
基于设计模式的数据访问研究与应用_第1页
基于设计模式的数据访问研究与应用_第2页
基于设计模式的数据访问研究与应用_第3页
基于设计模式的数据访问研究与应用_第4页
基于设计模式的数据访问研究与应用_第5页
资源描述:

《基于设计模式的数据访问研究与应用》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

中南民族大学硕士学位论文摘要随着面向对象分析技术和面向对象设计技术的不断成熟与推广,面向对象系统设计已经成为软件设计的主流方法。设计模式是面向对象技术的最新进展之一,更是软件领域中的研究热点之一。恰当的利用设计模式指导软件结构设计,不仅缩短软件设计和实现的周期,还可以提高软件的重用性、可移植性,能够起到事半功倍的作用。数据库是企业级应用系统的基石,即使最简单的桌面应用程序也要经常使用数据库以支持数据持久性。应用程序的开发是围绕数据的组织和存储、访问、处理以及数据的表示进行的。数据访问代码的性能对整个系统往往有很大的影响。数据访问逻辑的复杂性以及标准的多样性,使得代码经常成为设计中最困难的部分。而数据访问模式在数据访问领域起到模式所具备的作用,合理的使用数据访问模式可以达到有效的数据访问,去除对象模型和关系模型之间的阻抗不匹配的问题,提高可重用性和可维护性。首先介绍了设计模式的起源以及发展状况,阐述了面向对象技术、UML技术的基础知识,分析了MVC、Struts等相关技术平台。研究了设计模式的基本理论和设计模式的选择以及使用方法。详细分析了适配器模式、工厂模式、抽象工厂模式等几种具体的设计模式。提出了一种基于正交组件的数据访问设计模式的设计框架,该框架通过使用数据访问对象模式、主动域对象模式以及连接池模式实现了业务逻辑和数据访问层的松散耦合,使得应用程序更加容易的迁移到一个不同的数据库上实现。提出了在DAO模式中引入AbstractFactory模式,如此可以支持不同数据访问机制之间的可配置切换,即将类的静态替换屏蔽在系统之外,解决了DAO模式在实现支持不同类型的数据库平台时带来的部署难度和维护的复杂度大的问题。提出了在数据访问层引入Proxy模式,该模式通过提供一个中间层,将上层调用接口和下层实现相衔接,解决在DAO中使用AbstractFactory模式带来的一些BadShell问题以及DAO代码和核心Collection的紧耦合问题。利用提出的基于正交组件的数据访问设计模式的设计框架,结合Struts的Web应用开发,开发并实现了学生课程与成绩管理系统。实验证明了该设计框架是有效的和适用的。在实验的开发过程中也进一步阐述了设计模式如何解决企业应用系统中的问题。关键词:设计模式,数据访问对象模式,主动域对象模式,工厂模式,Struts框架-I- 基于设计模式的数据访问研究与应用ABSTRACTAsthedevelopmentandapplicationofobject-orientedanalysisandobject-orienteddesign,theobject-orientedsystemdesignhasbecomethemaintendencyofsoftwaredesignmethods.Designpatternisoneofthelatestdevelopmentsofobject-orientedtechnologies,whichisnowbeingoneofresearchfocusesallovertheworld.Properlyutilizationtodesignpatternsisofgreathelpthesoftwarestructuredesigntoreduceperiodofsoftwaredesignandapplicationaswellasimprovesoftwarereusageandtransplantation.Databaseisfundamentaltoenterpriseapplicationsystem,eventhesimpledesktopapplicationprogramusuallyneeddatabasetoensurethedatapermanence,andthedevelopmentoftheapplicationprogramfocusesonthedatamanagement,save,read,processanddataindication.Thedatareadingcodehaslargeinfluenceontheperformanceofthewholesystem.Thecomplexdatareadinglogicandvariegatedstandardresultinthemostdifficultcodedesign.Alsodataaccesspatternsactwhatthepatternplaysindataaccessfields.Toensurethevaliddatereadingfunctionandeliminatethemismatchingbetweenobjectmodeandrelationmodecanmakethereusagehigherandmaketheconvenientmaintenancestronger.Thisthsisfirstlyintroducestheoriginanddevelopmentofdesignpatternaswellasobject-orientedtechnologyandUMLtechnologyandanalysessomerelatedtechnologyplatformsuchasMVC,Strutsandresearchesthedesignpatterntheory,selectionandapplicationmethodfordesignpattern.Thenseveraldesignpatternincludingadapterpattern,factorypatternandabstractfactorypatternetcareanalyzedindetail.TheauthorpointsoutadesignstructureofDataAccessPatternwhichbasedonorthogonalcomponent.Fromthisstructure,therelaxcouplingbetweenbusinesslogiclayeranddataaccesslayerisachievedbyusingdataaccessobject,activedomainobjectandconnectionpool,anditismucheasiertochangedatabasesfortheapplicationprogram.TheauthorusesAbstractFactoryPatterntosolvetheproblemsofdispositionandmaintenancewhentheDAOPatternsupportsdifferentdatabase-platforms.ByusingtheAbstractFactoryPattern,thepatterncansupporttheswitchesofconfigurationamongdifferentdataaccessmechanismandthestaticchangesofclassarehiddedoutofthesystem.Inthispaper,ProxyPatternwhichappliesamiddlelayertoconnectthehigherinvokedinterfaceandlowerenablelayerisusedtosolvetheproblemsofBadshellandtightcouplingbetweenDAOandkernelcollection.AStudent’sCoursesandMarkManagementSystemisdevelopedbyusingthedesignstructureofDataAccessPatternbasedonorthogonalcomponentandthepracticalwebdevelopmentofStruts.Thevalidityandpracticalityisjustifiedthroughthisdevelopment.Theapplicationsofdesignpatterninsolvingtheproblemsofenterpriseapplicationsystemareinterpretedduringtheprocessofexperiment.KeyWords:Designpattern,DAO,ADO,Factory,Strtus-II- 中南民族大学学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权中南民族大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。本学位论文属于1、保密□,在______年解密后适用本授权书。2、不保密□。√(请在以上相应方框内打“√”)作者签名:日期:年月日导师签名:日期:年月日 中南民族大学硕士学位论文第1章绪论1.1研究背景及意义数据库是企业级应用系统的重要基础,目前许多应用系统的主要资源多用在实现和管理数据访问上,数据访问代码的性能对整个系统的质量会产生很大的影响;同时,数据访问逻辑的复杂性以及标准的多样性,使得数据访问代码成为系统设计中最困难的部分之一。因此,开发人员必须花费大量的精力来设计有效的数据访问代码,否则将会影响整个系统的运行效率或系统的稳定性。对于面向对象模型的数据存储方式,最直接的方法是OODB(Object-OrientedDatabases,面向对象数据库)。然而目前市场上面向对象数据库的产品还不够成熟,而基于某种OODB开发的应用系统又不太可能移植到其他数据库产品上,大量的应用系统仍采用产品成熟、通用性和移植性更好的关系数据库作为底层的数据存储和管理系统。所以,现在应用系统多采用面向对象方法进行分析和设计,用关系数据库存储数据。在20世纪80年代,计算机专家们提出了设计模式的概念,设计模式是指利用面向对象语言的类和方法来实现某个编程目标的方法。它通过提供一个显式的类和对象作用关系以及它们之间的潜在关系来说明规范,提高已有系统的文档管理和系统维护的有效性。恰当的利用设计模式指导软件结构设计能够起到事半功倍的作用,它不仅可以缩短软件设计和实现周期,还可以提高软件的重用性和移植性。研究发现,在数据访问领域中研究和应用设计模式对促进软件产业的发展有深远的意义和实际的使用价值。改进的数据访问模式可以解决应用程序数据库被访问时的紧耦合引起的维护性,复用性差的问题。人们也可以更简单方便的复用成功的设计模式以提高软件复用的程度,进一步保证系统的稳定性、灵活性。1.2国内外研究现状1987年,WardCunningham和KentBeck应用著名建筑大师Alexander在建筑领域里的一些思想理论,开发了设计模式并把这种思想用到了Smalltalk中的[1]图形用户接口的生成中。20世纪90年代初期,ErichGamma在他的苏黎世大学博士毕业论文中开始把最初的设计模式的思想改写为适用的软件开发。从1990年到1992年,ErichGamma,HelmR,JohnsonR,VlissidesJ(简称“四人帮”)的成员开始进行搜集模式的工作。关于模式的讨论和工作会议相继--1 基于设计模式的数据访问研究与应用多次举行。在1993年8月,KentBeck和GradyBooch在科罗拉多主持召开的第一次关于模式的会议。模式研究的主要人物都参加了这次会议,包括JimCoplien,DougLea,DesmondD'Souze,NormKerth,WolfgangPree等。随后,在1994年,[2]“四人帮”指出了23种经典设计模式,在计算机领域产生了非常深远的影响,设计模式成为软件工程领域中的热门研究课题之一。并在此之后设计模式的研究逐渐热门化,设计人员也开始在很多领域有针对性的使用设计模式。目前,国外软件工程界正把设计模式应用于软件体系结构、设计、编码和软件开发的过程和组织,其理论成果主要体现在从1994年开始的“程序设计模式语言(PatternLanguagesofProgramming.P1oP)”年会论文集中。而仅在数据库访问方面的技术就有以下研究成果。1.ODBC/JDBCODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司WOSA(WindowsOpenServicesArchitecture,开放服务结构)中提供的为异质数据库的访问统一的接口。ODBC基于SQL(StructuredQueryLanguage),并把它作为访问数据库的标准。这个接口提供了最大限度的相互可操作性,即一个应用程序可以通过一组通用的代码访问不同的数据库管理系统。一个软件开发者开发的客户/服务器应用程序不会被限定于某个特定的数据库之上。ODBC可以为不同的数据库提供相应的驱动程序。JDBC(JavaDataBaseConnectivity,Java数据库连接技术)是由Sun公司的Javasoft制定的。JDBC是一个支持基本SQL功能的通用底层应用程序接口,为各种常用数据库提供无缝联接的技术。它在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。2.OLE/DBOLEDB是Microsoft的数据访问模型。它使用组件对象模型(COM)接口,封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。它也提供了对包括关系数据库和非关系数据库在内的所有文件系统的底层接口。OLEDB支持开发访问各种数据源的应用程序,无论是DBMS还是非DBMS数据源。OLEDB通过使用支持某一给定数据源的相应的DBMS功能的COM接口,使得对数据源的通用访问成为可能。3.ActiveXDataObjectMicrosoftActiveXDataObject使得客户端应用程序能够通过任何OLE/DB提供者来访问和操作数据库服务器中的数据。它同时具有远程数据服务(RDS)功能,通过RDS可以在一次往返过程中实现将数据从服务器移动到客户端应用程序或Web页,在客户端对数据进行处理然后将更新结果返回服务器的操作。4.UDA微软推出的UDA(UniversalDataAccess,统一数据访问技术)为关系型或非-2- 中南民族大学硕士学位论文关系型数据访问提供了一致的访问接口,为企业级B/S应用多层软件结构提供了数据接口标准。统一数据访问包括2层软件接口,分别为ActiveXDataObject和OLEDB,对应于不同层次的应用开发。ActiveXDataObject提供了高层软件接口,可在各种脚本语言(Script)或一些宏语言中直接使用;OLEDB提供了底层软件接口,可在C/C++语言中直接使用。5.EJBEJB作为Sun公司提出的J2EE体系的核心部分,是Sun所力推的企业级开发的首选,而EJBEntity目前仍然是SunJ2EE白皮书所最为推荐的Java持久化技术。不过作为一个重量级技术,EntityBean的性能不太尽人意,易用性也相对较差,这成为它备受争议的一个焦点。1.3论文的研究内容在面向对象应用中内嵌SQL代码或者其他耦合数据库访问代码的数据访问方式没有考虑到应用和关系数据库的维护性问题,这种设计会造成应用系统内在的脆弱性,因此企业级应用的开发者在设计数据访问组件时,需要考虑以下一些问题:(1)应用必须能在多种数据库产品上正常运行;(2)用户接口要隐藏复杂的数据库语义;(3)数据访问的过多细节使得应用的代码难以很好的编写和维护;(4)数据访问频繁的应用必须要设计数据缓冲机制;(5)多用户访问数据时要解决并发问题。针对以上面向对象应用中的普遍问题,如何在应用系统中搭建合适的数据访问组件以支持对象-关系映射,使应用具有支持多数据库产品的能力、编写易于维护的数据访问代码和良好的数据访问性能成为企业级应用开发的关键之一。这对于提高开发效率和质量,增加应用的维护性和健壮性大有裨益。本文以此为研究的出发点,研究的内容主要包括:第一,研究模式,设计模式以及相关基础知识。第二,对数据访问层以及其中的数据访问模式、主动域模式和缓存模式等模式进行分析和对比。第三,结合数据访问层的多种设计模式,提出一种轻量级的对象持久层框架的设计,并通过轻量级对象持久层框架结合Struts的Web应用开发,验证该框架的有效性和实用性。本文由6章构成,具体安排如下:第1章绪论。介绍课题的研究背景,设计模式的研究现状及本文的主要工作。-3- 基于设计模式的数据访问研究与应用第2章面向对象技术、UML技术知识和相关技术平台的介绍。在本章中详细介绍UML的建模机制和Struts框架的工作流程等基础知识。第3章设计模式的定义,使用规则和几种常用的设计模式的研究。在研究设计模式的原则、策略以及分类的基础上,重点阐述适配器模式、桥接模式、工厂模式等几种常用的设计模式。第4章分析和总结数据访问层的各种设计模式及性能优化策略。用结构图、顺序图等辅助解释说明数据访问对象,主动域对象模式等的工作原理与实现策略。第5章给出基于层的结构设计,并对相关设计细节进行分析和描述。给出一种轻量级的对象持久层框架的设计开发——学生课程与成绩管理系统,通过轻量级对象持久层框架结合Struts的Web应用开发,以验证该框架的有效性和实用性。总结与展望对本文和相关研究工作进行总结,讨论了下一步研究的有关内容。-4- 中南民族大学硕士学位论文第2章相关知识基础2.1面向对象技术从提出面向对象的概念以来,面向对象技术作为一种优秀的应用开发方法已经得到广泛的应用,越来越多的个人和组织意识到它相对于结构化的软件开发方法的优势,由于面向对象模型更能直观的表达和反映现实世界的事务,具有封装、继承、多态等特性,使得系统的可重用性、健壮性和可扩展性大为提高,也更利于软件维护。使用面向对象模型而不是关系模型来进行系统分析与设计已经成为大多数应用开发人员的第一选择。面向对象技术的原则可以概括如下:(1)对象是具有明确定义的责任的事物。(2)对象对自己负责。(3)封装是指任何形式的隐藏(包括数据、实现、类、设计和实例化的隐藏)。(4)使用共性和可变性分析抽象出行为和数据中的变化。(5)按接口设计。(6)将继承看成一种把变化概念化的方法,而不是创建已有对象的特殊情形。(7)将变化放入一个类中,并与该类中的其他变化解耦。(8)力求强内聚和松耦合。内聚性(Cohesion)是指例程/类中的操作之间联系的紧密程度。耦合性(Coupling)则是指2个例程/类之间联系的紧密程度。内聚性描述的是一个例程内部组成部分之间相互联系的紧密程度,而耦合性描述的是一个例程和其他例程[3]之间联系的紧密程度。软件开发的目标应该是创建这样的例程:内部完整(高内聚),与其他例程之间的联系则是小巧、直接、可见、灵活的(松耦合)。(9)将使用一个对象的代码与创建该对象的代码分离。(10)在应用“一次且仅一次”规则时绝对小心。(11)通过“按意图编程”使用反映意图的名字,确保代码的可读性。2.2UML技术UML(UnifiedModelingLanguage,统一建模语言)是一种以可视化的观点来看的程序系统,是将规格和设计重点直接写下来的一种表现方式,也是用来创建程序模型的图形语言。它不仅统一了Booch,Rumbaugh和Jacobsan的表示方法,而且对其做了进一步的发展,最终统一为大众所接受的标准建模语言。UML代表了面向对象方法中的软件开发技术的发展方向,具有巨大的市场前景,也--5 基于设计模式的数据访问研究与应用具有重大的经济价值和国防价值。UML包括3个主要要素:UML的基本模块、支配这些模块如何放在一起的[4]规则和一些运用于整个UML的公共机制。2.2.1UML的模块组成UML包含3种模块:事物、关系和图。事物是对模型中的最具有代表性成分的抽象。UML中的事物有4种,分别是结构事物、行为事物、分组事物和注释事物。这些事物是UML中基本的面向对象的构造块。关系把事物结合在一起,图(Diagram)是一组元素的图形表示,它聚集了相关的事物。一般情况下把图画成顶点(代表事物)和弧(代表关系)的连通图。UML包括9种这样的图:类图、对象图、用例图、顺序图、协作图、状态图、活动图、组件图和配置图。2.2.2UML规则UML的构造块并非简单地按随机的方式放在一起,而是依据UML的规则确定模型的结构是否良好来进行存放。UML的语义规则如下:(1)命名:为事物、关系和图起名。(2)范围:给一个名称以特定含义的语境。(3)可见性:怎样让其他人使用或看见名称。(4)完整性:事物如何正确、一致地相互联系。2.2.3UML的静态建模机制任何建模语言都以静态建模机制为基础,统一建模语言UML也不例外。它的静态建模机制包括用例图、类图、对象图、组件图和配置图。1.用例图用例图(UseCaseDiagram)是参与者的外部用户所能观察到的系统功能的模型图,从用户的角度描述系统功能,并指出各功能的操作者。(1)用例模型用例模型(UseCaseModel)描述的是外部执行者(Actor)所理解的系统功能。用例模型用于需求分析阶段,它的建立是系统开发者和用户反复讨论的结果,它表明了开发者和用户对需求规格所达成的共识。在UML中,一个用例模型由若干个用例图描述。(2)用例和执行者-6- 中南民族大学硕士学位论文从本质上讲,一个用例(UseCase)是用户与计算机之间的一次典型交互作用。在UML中,用例被定义成系统执行的一系列动作,动作执行的结果能被指定执行者察觉到。执行者(Actor)是指用户在系统中所扮演的角色,其图形化的表示是一个小人。需要注意的是执行者未必是人。例如,执行者也可以是一个外界系统。2.类图、对象图(1)类图类图(ClassDiagram)是应用领域或应用解决方案中概念的描述。它不仅定义了系统中用于表示类之间的联系如关联、依赖、聚合等,也包括类的内部结构(类的属性和操作)。在UML中,类的可视化表示为一个划分成3个格子的矩形。矩形表示一个类,3个格子依次表示:类名、类的数据成员和类的方法。如图2.1所示。类名aa举例类的数据成员-:areadouble类的方法+(area)图2.1类图示意图(2)类图中的关系关联关系(Association)表示2个类之间存在某种语义上的联系。关联上加上[5]箭头表示方向,其作用是表示该关联单方向被使用,在UML中称为导航。如图2.2所示。表示ClientUsesTargetClient使用了Target图2.2类的关联性聚集关系表示类之间是整体与部分的关系。在需求分析中,“包含”、“组成”、“分为⋯部分”等经常被设计成聚集关系。在UML中,聚集表示为一头为空心菱形的连线。如图2.3所示。AAAABBBB图2.3聚集图2.4组合图2.5继承图2.6依赖-7- 基于设计模式的数据访问研究与应用组合关系如图2.4所示,在UML中,组合表示为一头为实心菱形的连线。其含义是A是由B组成的,A包含B类型的对象。继承关系定义了一般元素和特殊元素之间的分类关系。在UML中,继承表示为一头为空心三角形的连线。如图2.5所示。依赖关系,有2个元素A,B,如果修改元素A的定义可能会引起对另一个元素B的定义的修改,则称元素B依赖于元素A,即B使用A。在UML中,依赖表示为一头为实心三角形的连线。如图2.6所示。(3)对象图对象图(ObjectDiagram)是类图的实例,几乎使用与类图完全相同的标识。对象图区别于类图的是对象图显示类的多个对象实例,而不是实际的类。3.组件图和配置图组件图和配置图显示系统实现时的一些特性,包括源代码的静态结构和运行时刻的实现结构。(1)组件图(ComponentDiagram):描述代码部件的物理结构及各部件之间的依赖关系,用于显示代码本身的结构。一般来说,软件组件就是一个实际文件,可以是源代码文件、2进制代码文件或可执行文件等。组件图可以用来显示编译、链接或执行时构件之间的依赖关系。(2)配置图(DeploymentDiagram):描述系统硬件的物理拓扑结构以及在此结构上执行的软件,用于显示系统运行时的结构。配置图可以显示计算结点的拓扑结构、通信路径、结点上运行的软件组件、软件组件包含的逻辑单元等。(3)组件在配置图中代表可执行的物理代码模块,如一个可执行程序。逻辑上它可以与类图中的包或类对应。因此,配置图中可显示运行时各个包或类在结点中的分布情况。(4)对象,一个面向对象软件系统可以运行很多对象。由于组件可以看作与包或类对应的物理代码模块,因此组件中应包含一些运行的对象。2.2.4UML的动态建模机制1.消息在面向对象技术中,对象间的交互是通过对象间的消息传递完成的。在UML的4个动态模型中均用到消息这个概念。通常,当一个对象调用另一个对象的操作时,即完成了一次消息传递。当操作执行后,控制权便返回到调用者。在UML中,用带有箭头的线段将消息的发送者和接收者联系起来,箭头的类型表示消息的类型,UML定义的消息类型有3种,分别是简单消息、同步消息和异步消息。2.状态图-8- 中南民族大学硕士学位论文状态图(StateDiagram)用来描述一个特定对象的所有可能状态及其引起状态转移的事件。大多数面向对象技术都用状态图表示单个对象在其生命周期中的行为。一个状态图包括一系列的状态以及状态之间的转移。如图2.7所示。cokClosedmicpllceteClickOpeningClosingcclickomkpcllietecOpenclickStayOpen图2.7状态图所有的对象都具有状态,状态是对象执行了一系列活动的结果。当某个事件发生后,对象的状态将发生变化。状态图中定义的状态有:初态、终态、中间状态和复合状态。其中,初态是状态图的起始点,而终态则是状态图的终点。一个状态图只能有一个初态,而终态则可以有多个。中间状态包括2个区域:名字域和内部转移域,如图2.8所示。图中内部转移域是可选的,其中所列的动作将在对象处于该状态时执行,该动作的执行并不改变对象的状态。LoginEntrylogin/Dogetusername/Exitloginuserpassword/()图2.8状态图3.顺序图顺序图(SequenceDiagram)用来描述对象之间动态的交互关系,着重体现对象之间消息传递的时间顺序。顺序图中的水平轴表示不同的对象,垂直轴表示时间。顺序图中的对象用一个带有垂直虚线的矩形框表示,并标有对象名和类名。垂直虚线是对象的生命线,用于表示在某段时间内的对象是存在的。对象间的通信通过在对象的生命线之间画带箭头的线来表示消息,消息的箭头指明消息的类型。如图2.9所示。-9- 基于设计模式的数据访问研究与应用:Client:Server:Deviceopen消息1print消息2消息4消息3colse消息5图2.9顺序图4.协作图协作图(CollaborationDiagram)用于描述相互协作的对象间的交互关系和链接关系。虽然顺序图和协作图都用来描述对象间的交互关系,但顺序图着重体现交互的时间顺序,协作图则着重体现交互对象间的静态链接关系。协作图可以使用CASE工具自动转换为顺序图。协作图中对象的外观与顺序图中的一样。如果一个对象在消息的交互过程中被创建,则可在对象名称之后标以(new)。类似地,如果一个对象在交互期间被删除,则可在对象名称之后标以(destroy)。对象间的链接关系类似于类图中的联系(但无多重性标志)。通过在对象间的链接上标识带有消息串的消息(简单、异步或同步消息)来表达对象间的消息传递。5.活动图活动图(ActivityDiagram)用于描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动。活动图是由状态图变化而来的,它们各自用于不同的目的。活动图依据对象状态的变化来捕获动作(将要执行的工作或活动)与动作的结果,且活动图中一个活动结束后将立即进入下一个活动。2.2.5UML建模过程当采用面向对象技术设计系统时,首先应建立系统的逻辑模型,然后建立相应的物理模型。建立系统逻辑模型的过程大致分为3步:第1步描述需求分析,第2步根据需求建立系统的静态结构,第3步是描述系统的行为。其中在第1步与第2步中所建立的模型都是静态的,可用3种图来描述,即用例图、类图和对象图。而第3步中所建立的模型或者可以执行,或者表示执行时的时序状态或交互关系,因此可以用状态图、活动图、顺序图和协作图来描述。-10- 中南民族大学硕士学位论文2.3技术平台介绍2.3.1MVC基础MVC是目前广泛流行的一种软件开发模式,它是Model-View-Controller的简称。MVC把一个应用程序分为3个层次:模型层、业务处理层、控制层。各层各自处理自己的任务,图2.10就是MVC的结构图。(控制器)用户请求接受用户请求业务处理调用模型层响应用户请求l选择视图显示响应结果视图选择(视图)视图更新(模型)封装应用程序状态接受用户更新请求响应状态查询发送用户请求给控制器视图查询处理业务流程允许控制器选择视图通知视图业务状态更新图2.10MVC结构图1.MVC各层定义视图(View)是用户看到并与之交互的界面。对于Web应用而言,可以概括为HTML界面,也有可能为XHTML、XML或Applet。而MVC对于视图的处理仅限于视图上的数据的采集和处理,以及用户的请求。模型(Model)是应用程序的主体,负责业务流程、状态接受处理以及业务规则的制定。业务流程的处理过程对于其他层来说是黑箱操作,模型接受视图请求的数据,并返回最终处理的结果。一个模型可以同时为多个视图提供数据,提高了代码的可重用性。业务模型中还包含另外一个重要的模型,即数据模型,数据模型主要指实体对象的数据保存(持久性)。控制器(Controller)用于接收用户输入,并调用模型和视图来完成用户请求。在用户提交表单时,控制器本身不做任何处理和输出工作。控制器仅仅要接收请求然后调用模型组件以处理请求,最后调用视图来显示模型处理后返回的数据。2.MVC处理过程(1)控制器接收用户的请求,然后决定调用哪个模型进行处理。(2)模型进行相应的逻辑处理,然后返回处理后的数据。(3)控制器调用视图将模型返回的数据呈现给用户。-11- 基于设计模式的数据访问研究与应用2.3.2JSPModel2JSPModel2的结构图如图2.11所示。1请求(控制器)Selvlet说明:(1)JSP负责生成动态页面2实例化(2)Servlet负责流程控制4(3)JavaBean负责业务逻辑5响应(模型)(视图)JavaBeanJSP3应用服务器和数据库图2.11JSPModel图2.3.3Struts框架介绍1.Struts结构图Struts是Apache组织Jakarta项目组的一个基于Web的免费且公开源代码的项目。实际上,Struts是在JSPModel2的基础上实现的一个MVC框架。它将Servlet和JSP标记(属于J2EE规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts作为第一个基于MVC设计模式的开源JavaWeb编程框架,在业界受到广泛的尊崇,得到普遍应用,已经成为一个主流的Web编程框架。在Web系统设计中,采用基于MVC模式的Struts框架结构,可以使所设计的Web系统能够很好的将显示和逻辑分[6]离,并易于扩展和维护,可重用性强。其结构如图2.12所示。委派业务逻辑事件控制器ActionServletHTTP请求ActionForm转发Struts-config.xml客户端浏览器更新视图Get模型HTTP响应JSP应用程序的状态TagLibreries图2.12Struts结构图客户端通过浏览器发出请求后,请求被控制器ActionServlet获得,ActionServlet在Struts-Config.xml配置文件中查找有效映射,然后将相应的-12- 中南民族大学硕士学位论文ActionMapping对象转发给Action处理器对象进行处理。Action处理器对象访问ActionForm中的数据,处理和响应客户的请求;它还调用后台的Bean组件,这些组件封装了具体的业务逻辑。Action处理器对象根据处理结果通知控制器,然后控制器进行下一步的处理。2.Struts的实现原理(1)控制器控制器的作用是从客户端接收请求,并且选择执行相应的业务逻辑。然后把响应结果送回到客户端。Struts中的Controller功能由ActionServlet和ActionMapping对象构成。核心是一个Servlet类型的对象ActionServlet。Servlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个[7,8]请求到一个具体的Model部分中的Action处理器对象之间的映射。(2)模型Struts为模型部分提供了Action和ActionForm对象,所有的Action处理器对象都是开发者从Struts的Action类派生的子类。Action对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象可以通过定义属性描述客户端表单数据,开发者可以从它派生子类对象;利用它和Struts提供的自定义标记库,可以实现对客户端的表单数据的良好封装和支持;Action对象可以直接对ActionForm组件对象进行读写,而不再需要与Request、Response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts也可根据[7,8]系统的复杂度使用实体Bean和会话Bean等组件来实现系统状态。(3)视图Struts中的视图部分就是一组JSP文件。在这些文件中既没有业务逻辑,也[7,8]没有模型信息,只有标签。Struts提供了自定义的标记库,通过这些自定义标记可以非常好的与系统的Model部分交互,创建的JSP表单实现与Model部分中的的ActionForm映射,完成对用户数据的封装,同时自定义标记还提供了像模板定制等多种显示功能。3.Struts框架响应客户请求的工作流程当ActionServlet接收到一个客户请求时,将执行如下步骤:(1)检索与用户请求相匹配的ActionMapping实例,判断实例是否存在。如果实例不存在,则创建一个ActionMapping对象,它包含了把请求转发给哪个Action的信息。(2)判断ActionForm是否存在,如果不存在,则创建一个ActionForm对象,并把客户提交的表单数据保存到ActionForm对象中。(3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。-13- 基于设计模式的数据访问研究与应用(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,则表示表单验证成功;如果返回一个或多个ActionError的ActionErrors对象,则表示表单验证失败。在这种情况下,不会再创建Action对象并调用Action的execute()方法。(5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。(6)Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。(7)ActionForward对象指向的JSP组件生成动态页面,返回给客户。因此Struts的工作数据流程图如图2.13所示。客户端浏览器HTTP请求转发Struts-config.xmlJSP页面生成转发ActionServletAction创建业务对象HTML生成表单TXTXMLActionFormBusinessObject图2.13Struts工作流程图4.Struts的核心组件(1)ActionServlet它充当着Struts框架的中央处理器,根据配置文件的制定描述,将HTTP客[9~10]户请求信息转发到适当的处理器。(2)Action它将请求和业务逻辑分开,是客户请求动作和业务逻辑之间的一个适配器。(3)RequestProcessorActionServlet把全部客户端的请求委托到RequestProcessor对象,RequestProcessor使用Struts-Config.xml文件检查请求URI,找出所对应动作[9,10]Action标识符。(4)ActionMapping控制器把一定的信息转发到相应的Action类时,需要一些与动作和请求信-14- 中南民族大学硕士学位论文息相对应的映射配置信息,而这些映射配置信息被存储在特定的配置文件Struts-Config.xml中。在内存中,每个位于Struts-Config.xml文件中的[9,10]元素都与ActionMapping类的一个实例相对应。(5)ActionForwardActionForward对象是配置文件。这些配置对象拥有唯一的标识以允许它们按照有意义的名称来检索。ActionForward对象建立来自位于Struts-config.xml[9,10]文件中的元素。(6)ActionForm它负责一个应用系统中消息转移的非持久性数据存储。ActionServlet使用AcitonForm来保存请求的参数,ActionForm中的属性名称与HTTP请求参数中的名称相对应,控制器将请求参数传递到ActionForm实[9,10]例,然后将这个实例传送到Action类。-15- 中南民族大学硕士学位论文第3章设计模式3.1设计模式的起源所谓模式是一种方案,利用这种方案人们可以完成某项工作;模式也是一种途径,通过这种途径人们可以达到某种目的;同时,一个模式也是一种技术,为了完成某项工作我们必须获取并利用的有效技术。这种思想可以应用于多种工作,如做饭、制造烟火、开发软件以及其他工作。模式最早由著名的建筑大师ChristopherAlexander提出,他认为,每个模式都描述了一个在人类的环境中不断重复出现的问题,进而描述了这个问题的解决方案的要素。通过这种方式,[1]解决方案能够百万次的反复应用,但是具体方式又不会完全相同。[11]模式一般由4个部分描述,即:(1)模式的名称。它用一两个词来描述模式的问题、解决方案和效果。(2)模式的目的,即要解决的问题。描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式时必须满足的一系列先决条件。(3)实现方法。描述了设计的组成成分,它们之间的相互关系以及各自的职责和协作方式。(4)为了实现该模式必须考虑的限制和约束因素。3.2设计模式基础设计模式在软件界中的出现始于1987年,从1990到1992年,ErichGamma,RichardHelm,RalphJohnson和JohnVlissides合作开展了设计模式的编写工作。ErichGamma在其博士学位论文中做了一些开创性的工作,总结、归纳了当时的设计模式,并将设计模式应用到GUI框架ET++中,进一步推动了设计模式的发展。3.2.1设计模式的定义设计模式就是能够重复应用于多个问题的解决方案,而且是经历了时间的[11]考验,已经被证明是优秀的解决方案。设计模式主要包括以下几个部分:(1)模式名和分类模式名:描述了模式的本质,用于唯一标识每一个模式。(2)意图:陈述模式的基本原理和设计意图及解决什么样的特定设计问题。(3)动机:说明一个设计问题以及如何使用模式中的类、对象来解决该问题的特定情形。--16 中南民族大学硕士学位论文(4)适用性:说明什么情况下可以使用该设计模式以及该模式可用于改进哪些不良的设计。(5)结构:采用基于对象建模技术的表示方法对模式中的类进行图形描述。使用交互图来说明对象之间的请求序列和协作关系。(6)参与者:设计模式中的类和对象以及它们各自的职责。(7)协作者:模式的参与者如何协作以实现它们的职责。(8)效果:模式如何支持它的目标,使用模式的效果和所需要做的权衡取舍。系统结构的哪些方面可以独立改变。(9)实现:实现设计模式时的技术要点以及应避免的缺陷。3.2.2使用设计模式的意义设计模式提供了通用的、可重用的设计,在设计层次上解决问题。设计模式不定义代码,不针对给定的编程领域,而是为一类相似的问题提供了经过验证和测试的解决方案。它可以实现如下几条。(1)复用解决方案:吸取别人的经验,避免重蹈覆辙。(2)确立通用术语:为开发人员在项目的分析和设计阶段提供了共同的基准点,有利于改善团队的沟通。(3)提供了观察分析和设计的更高视角,从“细节桎梏”中分离出来。(4)代码更易于维护和修改。(5)设计模式可以很好的阐述基于面向对象的原则,具体体现为:按接口编程;尽量用聚合代替继承;找出变化并封装之。3.2.3设计模式的原则与策略1.开闭原则开闭原则是指模块、方法和类应该对扩展开放,对修改封闭。即软件的设[12]计不对其原有代码修改就能扩展功能。2.从背景设计原则也就是在设计各部分所呈现的细节之前,先创建总体概念。3.依赖倒置原则该原则的理念是编程时要依赖接口编程,而不是针对实现编程;应该在设[13]计细节之前创建总体概念。包括:(1)高层模块不依赖于低层模块。高层模块和低层模块应该依赖于抽象。(2)抽象不应该依赖于细节,细节应该依赖于抽象。4.封装变化原则在类中封装变化:不要让一个类封装2个要变化的事物,除非这些变化明确的耦合在一起(比如一个数据库的多个实现方法)。因为这样会降低内聚性,变-17- 基于设计模式的数据访问研究与应用化之间的耦合也无法松散。5.理性怀疑原则小心过分依赖模式。概念层次的模式和模型都是真理的抽象。它们是以往经验和教训的结晶。[11]正如Alexander曾经描述的一样:“只要你盲从、机械地使用模式,他们就和任何其他的意向一样将干扰你的现实感。只有你恰当地漠视它们,你才会恰当地使用它们。”“只有你能充分摆脱那种帮助你的模式时,你才能建造一个富有活力的建筑。你所听到的是多么的矛盾。”“最终,只有当一个使用(模式)语言的人到达无我境地时,建筑才成为有生气的。只有那时他才能认识到真实存在的作用力,而不被意向吓倒。”“但在那个时刻,他不再需要(模式)语言了。一旦一个人自由到这样一种程度,他能够看到真实存在的作用力,并建造一个单纯由作用力塑造的建筑,而不被其意向所影响或干扰——那么他就能足够自由地建造,而完全不用(模式)语言——因为模式包含的认识,作用力真正作用的方式的认识是他的。”在进行设计应对变化的过程中,应遵循2条基本策略:(1)找出变化并封装之;(2)优先使用对象聚集,而不是类继承。3.2.4设计模式的分类[14]软件设计模式的分类有不同的方法,本文主要根据以下3方面进行分类。根据应用的领域,设计模式分为通用领域的设计模式和特殊领域的设计模式。特殊领域包括并发领域、分布式领域、持久化机制领域和时间领域等。在应用的领域,依据目的不同,模式可分为创建型模式、结构型模式和行[11,15]为型模式3类。(1)创建型模式与对象的创建有关,即描述怎样创建一个对象。它隐藏对象创建的具体细节,使程序代码不依赖具体的对象。(2)结构型模式处理类或对象的组合,用于将已有的代码集成到新的面向对象的设计中。即描述类和对象之间怎样组织起来形成大的结构,从而实现新的功能。(3)行为型设计模式描述算法以及对象之间的任务(职责)分配,用于封装行为的变化。它所描述的不仅是类或对象的设计模式,还有它们之间的通信模式。根据模式的作用范围是用于类还是用于对象,可将其分为类模式和对象模式。类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时便确定下来,是静态的;对象模式处理对象间的关系,这些关系在运行时刻是可以变化的,更具有动态性。-18- 中南民族大学硕士学位论文3.2.5设计模式的选择与使用根据ChristopherAlexander的思想,基于模式的设计方法应遵循以下几条原[11]则:(1)从对整体概念的理解开始,理解需要实现的目标。(2)找到在整体中出现的目标。(3)从其他模式创造背景的那些模式开始。(4)从背景向内应用这些模式,找到新的模式,并重复。(5)通过每次应用一个模式,改进设计,并在所创建的背景中予以实现。将以上原则应用于计算机领域的软件设计中,对于设计模式的使用可以分为以下3步:第1步找出模式。第2步分析和应用模式。(1)按背景的创建顺序将模式排序。其原理是,一个模式将为另一个模式创建背景,不会出现2个模式互为彼此创建背景的情况。(2)选择模式并扩展设计。根据排序,选择列表中的下一个模式,用它得到高层的概念设计。(3)找到其它模式,将它们添加到要分析的模式集合中。(4)对于还没有使用到概念设计的模式重复以上步骤。第3步添加细节,扩展方法和类的定义。面对大量的设计模式,针对具体问题选择适当的模式并不容易,尤其是面[16]对并不熟悉的新模式时。因此可以以下列一些选择模式的方法为依据。(1)模式目录通常根据目的、用途和作用范围等组织模式,从中不难找到适当的组。然后分析该组中的模式,再选择适合的设计模式。(2)浏览每个设计模式解决的设计问题,缩小具体问题可用的设计模式的范围。(3)研究模式怎样相互关联,可以利用模式的关系选择模式或模式组。(4)从支持变化的角度,搜索能够封装某种变化而不致重新设计系统的模式或模式组。(5)从导致系统重新设计的原因的角度,寻找能够解决问题的模式。对选出的设计模式还须正确的应用,才能发挥设计模式的作用。要有效利用设计模式,除了遵循上面所述的几个步骤之外,还应该理解和熟练使用所选择的设计模式。即要做到以下几个方面:(1)认真分析所选择的模式,特别是模式的适用条件和使用效果,确定该模式是否适合要解决的实际问题。-19- 基于设计模式的数据访问研究与应用(2)研究模式的结构、参与者和协作者,确保设计人员理解这个模式中的类、对象和组件以及它们的关联关系。(3)分析示例代码,学习如何实现这个模式。(4)选择模式参与者的名字,使它们在具体应用中有意义。(5)定义接口、组件、类及类之间的关系。(6)定义模式中专用于应用的操作名称,名字一般依赖于应用,使用的名字必须一致。(7)实现模式中协作部分涉及的操作。3.3几个常用的设计模式3.3.1Adapter模式—适配器模式1.定义将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能在一起工作的类可以在一起工作。它为一个功能正确但是接[17]口不合的对象创建了一个新的接口。2.关键特征(1)意图:使控制范围之外的一个原有对象与某个接口匹配。(2)问题:系统的数据和行为都正确,但接口不符。(3)解决方案:Adapter模式提供了具有所需接口的包装类。(4)参与者与协作者:Adapter改变了Adaptee的接口。使Adaptee与Adapter的基类Target匹配。(5)效果:使原有对象能够适应新的类结构,不受其接口的限制。(6)实现:将原有类包含在另一个类中,让包含类与所需要的接口匹配,调用被包含类的方法。3.Adapter结构图如图3.1所示。Client<<接口>><<接口>>消息1TargetAdaptee+RequestMethod()+UsefulMethod()Adapter+RequestMethod()图3.1Adapter结构图注:Adapter类扩展了Adaptee类,实现了Target接口。-20- 中南民族大学硕士学位论文4.实现classAdapterextendsAdaptee{…privateAdapteemyAdaptee;publicAdapter{myAdaptee=newAdaptee();}voidpublicrequestMethod(){myAdaptee.UsefulMethod();}}3.3.2Bridge模式—桥接模式1.定义Bridge模式是将抽象与实现解耦,使它们可以独立的变化。其中,抽象指的是一个依赖于一些抽象操作的类,并且这些抽象操作可能有多种实现。而实[2]现则是指抽象类及其派生类用来实现自己的对象。2.关键特征(1)意图:将一组实现与另一组实现用它们的对象分离。(2)问题:一个抽象类的派生类必须使用多个实现,但是不能出现类数量的爆炸性增长。(3)解决方案:为所有的实现定义一个接口,供抽象类的所有派生类使用。(4)参与者与协作者:Abstraction为要实现的对象定义接口,Implementor为具体的实现类定义接口。Abstraction的派生类使用Implementor的派生类,却无需知道自己具体使用哪一个ConcreteImplementor。(5)效果:实现与使用实现的对象解耦,提供了可扩展性。(6)实现:将实现封装在一个抽象类中。在要实现的抽象基类中包含一个实现的句柄。3.Bridge模式的一般结构图,如图3.2所示。<<接口>><<接口>>AbstractionImplemetor+opertion()+OperationImp()RefinedAbstractionConcreteImplementorAConcreteImplementorB+refinedMethodA()+refinedMethodB()+OperationImp()+OpertionImp()图3.2Bridge结构图-21- 基于设计模式的数据访问研究与应用4.实例要求实现“打印功能”,并新增“指定打印次数功能”。对于功能的类层次(1)抽象的参与者Abstraction——Display类(打印内容的类)publicclassDisplay{privateDisplayImplimpl;publicDisplay(DisplayImplimpl){this.impl=impl;}publicvoidopen(){impl.rawOpen();}publicvoidprint(){impl.rawPrint();}publicvoidclose(){impl.rawClose();}publicvoiddisplay(){open();print();close();}}(2)新增的参与者RefinedAbstraction——CountDisplay类。publicclassCountDisplayextendsDisplay{publicCountDisplay(DisplayImplimpl){super(impl);}publicvoidmultiDisplay(inttimes){open();for(inti=0;i><<接口>>AbstractProductAAbstractProductBProductA1ProductB1ProductA2ProducB2<<接口>>AbstractFactory消息3+createProductA()消息6+createProductB()消息4消息5ConcreteFactory1ConcreteFactory2+creteProductA()+creteProductA()+creteProductB()+creteProductB()图3.4AbstractFactory结构图-25- 基于设计模式的数据访问研究与应用在图3.4中,抽象工厂模式的结构图包含以下主要的类。(1)抽象工厂类(AbstractFactoiy):定义了创建产品组的接口。其中包括用几个创建不同产品的工厂方法。(2)具体工厂类(ConcreteFactoiyl,ConcreteFactoiy2)实现所有工厂方法。每个具体的工厂类负责一组具体的产品。(3)抽象产品类(AbstractProductA,AbstractProductB)定义了产品的抽象接口。(4)具体产品类(ProductAl,ProcuctA2,ProductB1,ProductB2):定义由具体的工厂创建的具体产品。实现抽象产品类的各种接口。一般情况下,客户程序只使用抽象工厂类和抽象产品类的接口来创建和使用产品。4.实例设计一个计算机系统,显示并打印取自数据库的几何形状,要求系统自己选择显示和打印的分辨率。(1)结构图如图3.5所示。Apcontrol消息1消息2<<接口>><<接口>>DisplayDriverPrintDriverLRDDHRDDLRPDHRPD<<接口>>ResFactory消息3+getDispDrvr()消息6+getPrtDrvr()消息4消息5LowResFacHighResFact图3.5结构图(2)顺序图如图3.6所示。-26- 中南民族大学硕士学位论文ApcontrolResFactoryLRDDLRPDAskforDisplayDriverMakeDriverTellClientaboutDriverUseDriverAskforPrintDriverMakeDriverTellClientaboutDriverUseDriver图3.6顺序图说明:ResFactory创建合适的驱动程序;ApControl只负责使用这些驱动程序。(3)实现代码段abstractclassRseFactory{abstractpublicDisplayDrivergetDispDrvr();abstractpublicPrintDrivergetPrtDrvr();}classLowResFactextentsResFactory{publicDisplayDrivergetDispDrvr(){returnnewLRDD();}publicPrintDrivergetPrtDrvr(){returnnewLRPD();}}classHighResFactextentsResFactory{publicDisplayDrivergetDispDrvr(){returnnewHRDD();}publicPrintDrivergetPrtDrvr(){returnnewHRPD();}}-27- 中南民族大学硕士学位论文第4章数据访问模式数据库是企业级应用系统的基石,即使最简单的桌面应用程序也经常要使用数据库。应用程序的开发也是围绕数据的组织和存储、访问、处理以及数据的表示进行的。数据访问代码的性能对整个系统往往有很大的影响。数据访问逻辑的复杂性以及标准的多样性,使得代码经常成为设计中最困难的部分。而数据访问模式在数据访问领域起到模式所具备的作用,因此合理的使用数据访问模式可以达到有效的数据访问,提高可重用性和可维护性。4.1数据访问对象模式4.1.1数据访问对象模式的描述DAO(DataAccessObject,数据访问对象模式)在单一组件内封装物理数据访问细节,只公开逻辑操作。应用程序代码保留关于底层数据模型的知识,[18,19]但与数据访问职能分开。DAO可以做到:(1)公开逻辑操作,封装物理操作。数据访问对象抽象可以公开读、插入、更新和删除等的逻辑数据库操作,而不需要应用程序代码发出SQL语句或者做类似的工作。(2)公开逻辑资源,封装物理资源。向应用程序代码隐藏的越多,改变起来越自由。如果让应用程序管理自己的数据库连接,就很难在以后引入连接池、语句缓存或者数据分布这样的增强机制。(3)规范化和格式化数据。数据的物理格式不一定是最适合应用程序处理的形式。特别是当来自多个数据库平台的格式不一致时。数据访问对象的实现可以负责对这些字节进行串转换并交给应用程序的一个对象表示。(4)封装平台细节。业务关系不断变化。如果企业建立了新的合作关系而要求应用程序支持另外的数据库产品,那么把数据库平台细节封装到数据访问对象中实现有利于这种变化。(5)封装优化细节。应用程序的性能不应该直接依赖于资源池和缓存这样的优化,它们限制了将来改变这些优化的能力。如果只允许应用程序代码分配逻辑资源和发出逻辑操作,就把实现这些操作的自由留给数据访问对象实现,它可以采用任何指定的优化策略。总之,DAO可以抽象数据源,提供对数据源的透明访问,提供业务层与数据访问层的松散耦合。--28 中南民族大学硕士学位论文4.1.2DAO实现策略DAO实现的组成部分包含一个DAO工厂类;一个DAO接口;一个实现了DAO接口的具体类;数据传输对象,即值对象。基本的DAO中包含了为每一个数据源提供GRUD(创建、读取、更新、删除)操作的DAO类,而每一个具体的DAO类包含访问特定数据源数据的逻辑。工厂类一般是专门负责将大量具有共同接口的类进行实例化的类。这些组件之间一般通过使用抽象工厂模式来实现,抽象工厂模式可以构造出多种类型的具体工厂,每种具体工厂一般支持一种类型的持久性存储,客户端在获取具体的DAO工厂后,就可以通过它来获得DAO对象,并由DAO对象为使用者提供统一的数据访问接口。因此当低层存储不会随着实现变化而变化时,该策略可以使用工厂模式来实现,产生一系列应用程序所需的DAO对象,每个DAO对象都封装了对数据层的访问。图4.1是这种情况下的类图。DAOFactoryRdbDAOFactoryOracleDAOMySqlDAOTecherDAOCourseDAO图4.1DAO模式类AbstractFactory模式可以根据不同的存储模式使用FactoryMethod模式产生几组针对不同存储模式的一系列DAO对象。图4.2是这种情况下的类图。它所对应的顺序图如图4.3所示。DAOFactoryXmlDAOFactoryOracleDAOFactoryMysqlDAOFactoryXmlUserDAOImplOracleUserDAOImplMysqlUserDAOImplUserDAO图4.2DAO模式类-29- 基于设计模式的数据访问研究与应用DataSourceBoDAOFactoryOracleDAOFactoryOracleUserDAOImplObjectOracleDAOFactory图4.3DAO模式顺序图4.1.3DAO结构图DAO的结构图,如图4.4所示。<<接口>>使用DAO业务对象+operationA()+operationB()获取/修改具体实现类数据源封装值对象+operationA()+operationB()创建/使用图4.4DAO结构图(1)业务对象代表业务层的数据访问请求端。正是该对象需要访问数据源以获得存储对象。客户对象可能是会话Bean、实体Bean或其它类型的Java对象。(2)DAO是该模式的主要对象。DAO抽取了客户对象的低层数据访问实现,以保证对数据源的透明访问。客户对象也可以把数据加载和存储操作委托给DAO。(3)数据源可以是RDBMS数据库、OODBMS和XML资料库等。(4)值对象代表用作数据携带者的值对象,是业务对象和DAO之间传递数据的载体。DAO一般使用值对象把数据返回给客户对象。当客户对象要更新数据源的数据时,客户端会把要更新的内容以值对象的形式传递给DAO。-30- 中南民族大学硕士学位论文4.1.4DAO交互图DAO交互图,如图4.5所示。BODAODSBO创建DAO对象获取数据BO执行获取的数据DAO对象获取数据VODS返回数据构建对象使用DS返回值创建VO对象返回值对象返回值对象业务逻辑通过得到值对象,对其属性进行设置使用VO公有方法业务逻辑通过值对象,获得相应属性设置数据使用方DAO法对进DS行设置数据操作图4.5DAO的交互图4.2主动域对象模式1.ADO描述ADO(ActiveDomainObject,主动域对象模式)是在相关的域对象实现中封装数据模型和数据访问细节,将数据模型的细节也封装在单一组件中,对应用程序仅公开与业务逻辑相关的通用操作。ADO中ActiveDomainObject类同时封装了关系数据访问和关系数据模型,关系数据模型由一个或多个数据对象组成,这些数据对象与数据库表具有一对一的映射关系。所有应用的业务对象都通过ActiveDomainObject的映射来实现物理数据库操作,并实现事务接口。通常,定义在一个ActiveDomainObject的通用操作主要有4个方面:(1)初始化(Initialize):读取一个或多个数据表以初始化DomainObject的内容。(2)刷新(Refresh):当数据表发生更新之后,通过这样的操作以更新DomainObject的内容。(3)保存(Save):将DomainObject内容的改变持久化至数据表中。(4)列表(List):根据查询条件获得所需的单个DomainObject或DomainObject集合。2.ADO的结构图如图4.6所示。-31- 基于设计模式的数据访问研究与应用ActiveDomainObjectApplication+(SetAttribute1)《接口》+(getAttribute1)PhysicalDatabaseDriver+(setAttribute2)+(getAttribute2)+(operationA)+(operationB)图4.6ADO的结构图3.ADO的交互图,如图4.7所示。应用程序数据库驱动程序ActiveDomainObjectConstructs读操作获取属性图4.7ADO实例化交互图4.3连接池模式1.连接池原理系统在内存中维持一个连接缓冲池,对于已经建立好的数据库连接,在程序(JSP、Servlet或EJB)中的断开是逻辑断开,而实际的物理连接仍然被存储在池中并被应用服务器维护。这样,当下一个应用访问时,可直接从连接缓冲池中取得一个数据库连接,而不需重新连接数据库,节省掉建立数据库连接带来的大[20]量开销。因此,可以大大地提高系统的响应速度,从而提高整个系统的性能。2.连接池实现在类中定义一个连接池。它能够根据要求创建新的连接,直到预定的最大连接数为止。在返回连接给客户程序之前它能够验证连接的有效性。连接池的定义如下:classDBConnectionPool{privateintcbeckedOut;privateVectorfreeConnections=newVector();privateintmaxConn;//此连接池允许建立的最人连接数privateStringname;//连接池的名字privateStringpassword;//连接密码privateStringURL;//数据库的JDBCURL-32- 中南民族大学硕士学位论文privateStringuses;//数据库账号}在连接池类DBConnectionPool中定义了以下方法以提供基本的管理功能。创建新的连接池:publicDBConnectionPool(Stringname,StringURL,Stringuses,Stringpassword,intmaxConn){……}创建新的连接:privateConnectionnewConnection(){……}从连接池获得一个可用连接,如果没有空闲的连接且当前连接数小于最大连接数限制时,则创建新的连接;如果原来登记为可用的连接不再有效,则从向量中删除之,然后递归调用自己以尝试新的可用连接:publicsynchronizedConnectiongetConnection(){……}将不再使用的连接返回给连接池:publicsynchronizedvoidf2eConnection(Connectioncon){……}3.连接池的优点在大批量访问数据库时,应用连接池模式可以极大的减少连接和关闭数据库的操作,显著地提高系统性能。优化连接池的设计,既要限制最大连接数,又要动态保留若干空闲连接,使得连接数据库的请求立即得到一个稳定的连接对象。4.4语句缓存模式1.语句缓存的原理多数关系数据库均支持语句句柄概念,应用程序使用语句句柄来执行数据库操作。从数据库的角度看,准备一条语句包括解析请求和分析语句,数据库将计算出应该如何高效地执行该语句。一旦得出最有效的执行策略,就由数据库引擎执行该语句,最后把执行结果反馈给客户。根据操作的复杂度,准备语句可能需要付出很高的代价。作为改善性能的一种方式,应该尽量减少应用程序准备语句的次数。特别是使用一个语句句柄相继进行多个操作时,如果一条语句执行一次后,数据库就记录下该语句的执行策略,那么再次执行相同语句时,就可以省去准备语句的过程。2.语句缓存的实现(1)SQL语句优化使用SQL操作数据库,语句操作的列可以是特定值或者参数,尽量使用带有参数的SQL语句,带有参数的语句具有内在的可回收性,如:SQL="updatet_i_infosettitle_name=?,type_name=?whereinfoid="+infoid这类语句在执行时可以插入不同的参数值。因此当应用程序大量使用这类语句时语句缓存会更有效。(2)使用预编译语句对象PreparedStatement-33- 基于设计模式的数据访问研究与应用在操作数据库时,使用PreparedStatement语句,对支持预编译的数据库可以提高执行速度。它向数据库传递的是不带数据的语句,以这样的形式被缓存。支持预编译功能的数据库(目前许多数据库如Oracle,SQLServer,DB2等均支持预编译功能)能够缓存一个SQL语句和它的编译结果。当有新的待执行的SQL语句被提交时,它将先把新语句与缓存中的语句进行匹配,如果缓存中已存在该语句的编译结果则直接取用之。在采用预编译语句对象前采用的SQL执行方式如下:sql="selectmax(info_id)fromt_i_info";Statementsmtt=mycon.createStatement();myts=smtt.executeQuety(sql);后来进行了如下修改:sql="selectmax(info_id)fromt_i_info";PreparedStatementpmtt=mycon.PreparedStatement(sql);psmt.executeUpdate();根据语句缓存的原理和实现,不难发现多数数据库环境都把语句句柄限制于单个连接,随着时间的推移和程序的使用,可能会出现有多个连接都管理相同的一组准备好的语句的情形。此时,可以把连接池和语句缓存结合起来,就可以减少准备好的语句数量。从而形成更有效地集成语句缓存的连接池。-34- 中南民族大学硕士学位论文第5章基于数据访问模式的分层设计5.1现有的企业应用开发模型1.传统的C/S模式20世纪90年代,传统的企业应用2层C/S体系结构出现,客户端与数据库完全分开,在客户端上运行了大部分服务,如数据访问规则、业务规则、合法性校验等。每一个客户端都存在数据引擎,并且每个客户端与数据库服务器建立独立的数据库连接。这种体系结构的企业应用系统的开发周期较短,能够适应大部分中小型企业应用系统的要求。但是,随着企业应用的日渐发展、数据容量和客户端数量的不断增加,这种体系结构显示出了诸多缺陷:扩展性差,由于建立数据连接占用系统资源,当数据连接达到一定数量时,服务器的响应速度与处理速度将大打折扣;可维护性差,由于业务规则通常置于客户端应用程序中,如果业务规则一旦发生变化,程序员就必须修改客户端应用程序;可重用性低,如果客户另外提出了其它的应用需求,则需要在Web服务器中重新进行数据库访问、业务规则、合法性校验等编码,而所做的工作与客户端应用程序中的功能完全重复,从而加大了工作量。正因为有诸多缺陷,使得3层(多层)体系结构成为目前企业应用开发的首选。2.传统的3层/多层体系结构3层结构通过把2层结构的业务逻辑与用户界面程序分开而形成,如图5.1所示。多层结构通过对业务逻辑层继续划分层次而形成。表示层业务逻辑层数据层用业户务数界逻据面辑库客户端服务器端图5.13层结构示意图图示的3层结构将业务逻辑和数据库驱动程序都放在服务器,从而只需要在服务器端集中部署即可。这种层次结构降低了系统部署和修改业务逻辑的开销。这种结构对于开发一般的企业应用系统可能已经足够,但是随着企业需求的提高,产品化趋势的上升,就需要在扩展性、重用性等非功能性角度进行充分的考虑,而且还要对特殊需求的功能进行设计,提高系统性能。设计模式正--35 基于设计模式的数据访问研究与应用是为了有效地解决此类软件问题而提出来的,下面我们仅在设计模式的基础上对企业应用领域3层结构模型中的数据访问模块进行扩展。5.2数据访问层的模式设计通过前面对设计模式的研究和讨论,我们知道设计模式是一组已经被实践证明了的成功方法,它们在系统的结构、代码的质量、可扩展性或某一特定的功能上有着重大的改善。但是设计模式只是寻求解决方案的指南,本身并非解决方案。尽管目前有些设计工具对常见模式的实现提供了模板,但不可能通过简单地把这些模板拖放到应用中直接解决,对于具体的应用环境,为了达到最优化,有必要调整或改造设计模式的具体实现。根据性能或结构特点而选用合适的设计模式,不但使程序代码的可重用性、扩展性增强,而且能提高效率、可靠性、移植性和维护性。正如第4章所述,企业应用系统开发中经常面临多种数据源(如关系数据库、面向对象数据库、XML,文档、文本文件)。而不同的数据源,其数据访问机制也就不同。即使对于同一类型的数据存储,由于供应商的不同,持久性储存API差别比较大,其数据访问差别也比较大。因此当业务逻辑组件(如BusinessObject等)需要访问某数据源时,它们可以使用合适的API来获得数据库连接,以及操作数据源。但是在这些组件中包含数据库连接和数据访问代码会引入这些组件与数据源实现之间的紧密耦合(当数据源变化时,组件也需要改变以便于能够处理新的数据源),从而造成应用程序从一种数据源向另一种数据源的移植困难。5.2.1层模式的提出1、分层技术一直以来,在设计复杂企业应用系统时,设计者采用最多的方法之一就是把一个问题化整为零,分为一个个子问题,再逐个击破,也就是所谓的分层。如硬件驱动程序、TCP/IP协议、J2EE应用软件的架构,都是以分层思想进行处理的。层结构有助于构建这样的应用:它能被分解成子任务组,其中每个子任务组处于一个特定的抽象层次上;高层提供的大多数服务由其相邻的底层提供的服务组成。采用分层技术,可以达到如下优点:(1)各层之间相互独立,高层不必关心低层的实现细节,只要知道低层所提供的服务,以及本层向上层所提供的服务即可,能真正做到各司其职。(2)易于维护,某个层次实现细节的变化不会对其他层次产生影响。不论应用于何种领域,如果要使用分层技术,只有把握如何划分层次,才-36- 中南民族大学硕士学位论文能达到最优的分层效果,原则上来说,要遵循以下几条原则:(1)层次的数量不能过多。(2)层次的数量也不能过少。(3)类似的功能放在同一层。(4)在实现技术经常变化的地方增加层次。(5)层次边界要选得合理,使层次之间的信息流量最小。2、基于正交组件的分层模式组件(Component)又称为构件,一般认为,组件是一种定义良好的、可复用的、具有一定功能的、能够独立工作或能同其它组件装配起来协调工作的程序体(计算单元)。它可以是一些功能模块、被封装的对象类、软件框架、软件系统模型等。上世纪60年代初,结构化的模块式软件开发思想占据了主流地位,这时组件的含义是指一些定义良好的函数包或功能模块;80年代起,面向对象软件开发思想迅速发展起来,这时组件的含义就是类库。而目前基于对象的软件体系结构中的组件是指可方便插入到语言、工具、操作系统、网络软件系统中[27]的程序体和数据。形象地说,组件可以被看成叫一种软件集成电路。所谓正交性,表示某种不相依赖性或是解耦性。如果2个或更多事物中的一个发生变化,不会影响其他事物,这些事物就是正交的。所谓正交组件,就是处理完全不相交问题的软件组件。它把复杂问题化整为零,分为完全不相交的子问题。我们把划分的正交组件就称为层,利用了层的设计的成功模型即为层模式(LayerPattern)。如应用程序中的数据模型与数据访问细节是正交的:数据模型是数据的静态结构,而数据访问是读、写数据的动态机制。因为改变数据模型,即使变化很大,一般也不需要修改数据访问细节,同样,如果只是改变数据访问细节,数据模型也一般不需要改变。因此使用层模式,有利于提高生产率与降低风险。对于层模式而言,每一层的实现并非是最困难的,只要在该层使用适合的模式或者编写合适的代码就可以完成。它的难点在于层的划分,本文依据分层的原则,认为以下的几个方面都是十分适合在单独层中实现:(1)数据访问细节:例如DataAccessorObject;(2)域对象映射:例如ActiveDomainObject;(3)缓存:例如数据缓存,Statement缓存;(4)数据源分布;(5)权限管理;(6)资源管理:例如连接池。-37- 基于设计模式的数据访问研究与应用随着层次划分的增多,随之而来的就是复杂性的提高,而且层初始化的成本也会相应的增加。恰到好处的层次划分在层模式的应用中尤其重要。3、改进的DAO模式使用DAO模式抽象和封装所有对数据源的访问,DAO实现了用来操作数据源的访问机制。依赖于DAO的业务组件为其客户端使用DAO提供了更简单的接口。DAO完全向客户端隐藏了数据源实现细节。由于当低层数据源实现变化时,DAO向客户端提供的接口不会变化,所以当DAO调整到不同的存储模式,不会影响其客户端或者业务组件。DAO充当着组件和数据源之间的适配器。采用DAO模式,系统可以实现以下结果:(1)业务对象对数据源的访问是透明的,业务对象在使用数据源时不需要了解该数据源的实现细节。(2)应用程序可以更加容易的迁移到一个不同的数据库实现。也就是指当需要迁移到另外一个不同数据库时,只需要添加一个新的具体工厂实现即可。(3)采用DAO模式,可以简化业务对象和其他使用DAO的客户端中的代码。所有与实现有关的代码都被包含在DAO中,提高了代码的可读性和代码的效率。但是DAO模式的使用也存在着一些不足。(1)在实现支持不同类型的数据库平台时,典型的DAO模式通过类文件的静态替换来实现。这样在面对大量客户和复杂的部署环境时,其部署难度和维护的复杂度将大大增加。(2)在DAO中使用AbstractFactory模式或者Factory模式时,可能出现一些BadShell问题。(3)DAO代码与JDBC和核心Collection耦合的非常紧密,不利于维护和移植。为了支持不同数据访问机制之间的可配置切换,即将类的静态替换屏蔽在系统之外,在DAO模式中引入AbstractFactory模式可以实现。AbstractFactory模式可以起到连接接口和实现的桥梁作用。业务层通过接口调用底层实现,具体的DAO实现类不会出现在业务代码中。而具体实现类在配置文件中加以配置,之后DAOFactory.getDAO()方法通过读取配置文件获得当前所期望使用的实现类的类名,再通过JavaClass动态加载机制加载后返回需要的数据。对于在DAO中使用AbstractFactory模式带来的一些BadShell问题以及DAO代码和核心Collection的紧耦合问题,可以通过引入Proxy模式加以解决。Proxy模式通过提供一个中间层,将上层调用接口和下层实现相衔接。从而解决BadShell问题以及松散耦合DAO代码和核心Collection。由于采用动态加载机制,系统中每次调用需要都读取配置文件,从而会引起大量的磁盘操作,采用HashMap作为DAO缓存实现实例可以避免这种大量的磁盘操作提高系统性能。-38- 中南民族大学硕士学位论文5.2.2基于正交组件的层模式的设计结构本文结合传统3层企业应用系统模型的自身特点,通过认真研究与重复实践,根据前面研究的基于设计模式的系统开发过程的方法,总结了一种基于设计模式的数据访问模型,该模型运用了DAO,AbstractFactory,Proxy,连接池等设计模式,把应用程序逻辑和物理数据代码之间分为连接管理层、数据访问层和主动域对象层。该模式用来改进传统3层结构企业应用系统模型的性能,[21~33]尤其是数据访问模块方面,并在一些开发环节上作了相应的改进。该模型的体系结构如图5.2所示。浏览器ViewJSPHttpForm/VOStrutsControllerStrutsActionMappingActionServletStrutsActionModelStrutsJavaBeanActiveFormVOConnection数据访问层ADODAOPoolingJDBCLDAPJDO关系数据库图5.2基于层模式的结构图1.模型的结构特点:(1)以三层体系结构为基础,Struts框架作为基本框架。(2)在业务逻辑和数据层之间添加的数据访问层。数据访问层主要采用DAO和ADO技术。(3)针对DAO的不足,添加Proxy模式以及进一步改进代码分组,达到解耦合的目的。(4)在数据层采用抽象工厂模式以解决对异类数据源的访问管理。2.数据访问层的结构由图5.2可以看到,数据访问层是应用程序逻辑到物理实现的一个逐渐映射过程,该模式划分成3层,层与层之间是正交组件的关系,每一层仅仅依赖于-39- 基于设计模式的数据访问研究与应用低一层的抽象,而每一层的实现可以看作从一个抽象到另一个抽象的适配器,如连接管理器实现是物理数据库驱动程序实现和连接管理器抽象的适配器,并在其中采用连接池进行连接。具体如图5.3所示。主动域对象数据访问器抽象数据访问器实现连接管理器抽象连接管理器实现物理数据库驱动程序图5.3层模式的数据访问层结构图它们之间的调用关系如图5.4所示,调用关系如下:接口接口接口应用程序第1层第2层第3层第3层的实现第1层的实现第2层的实现物理数据库驱动程序接口图5.4数据访问层的静态结构(1)应用程序调用第一层实现的一个实例,是系统的最高层抽象。(2)第一层实现用定制的功能实现操作,这些功能又对第2层实现的实例操作调用零次或者多次,依此类推第3层实现。(3)第一层抽象的图解说明如图5.5所示。一个应用程序第1层实现第2层实现第3层实现物理数据库驱动程序物理操作图5.5数据访问层的第一层抽象静态结构-40- 中南民族大学硕士学位论文3.数据访问层设计思想的代码体现(1)连接管理层连接管理层是程序代码的最底层,由数据管理器抽象和数据库管理器实现2部分组成,主要负责数据库连接和语句句柄。连接管理器抽象:公开了对系统中定义的任何数据源执行SQL查询和更新的操作。代码如下:publicinterfaceConnectionManager{ResultSetexecuteQuery(StringdataSource,Stringsql)throwsSQLException;intexecuteUpdate(StringdataSource,Stringsql)throwsSQLException;}连接管理器实现:实现了把数据源名插入到一个JDBCURL建立新的连接。它至多为每个数据源建立一个连接,并在后继操作中复用该连接。publicclassConcrateConnectionManagerimplementsConnectionManager{publicResultSetexecuteQuery(StringdataSource,Stringsql)throwsSQLException{⋯⋯//建立数据源连接}publicintexecuteUpdate(StringdataSource,Stringsql)throwsSQLException{⋯⋯//更新数据源操作}PrivateConnectionresolveConnection(StringdataSource)throwsSQLException{⋯⋯//如果在所建map中没有该连接,则创建新的连接}}(2)数据访问器层本层由数据访问器抽象和数据访问器实现2部分组成,其作用是代替客户端实现物理数据访问操作。数据访问器抽象:它使用逻辑数据库操作定义,完全没有显露任何SQL语句或者调用级的接口语义。代码如下:publicinterfaceDao(){Listread(Stringtable,String[]column,HashMapconditions)throwsSQLException;voidinsert(Stringtable,Listrows)throwsSQLException;voidupdate(Stringtable,RowselectedRow,RowupdateRow)throwsSQLException;voiddelete(Stringtable,RowselectedRow)throwsSQLException;}数据访问器实现:是基于数据连接器实现的,有效的充当了数据连接器抽象接口与数据访问器接口的适配器。代码如下://生成和发出SQL语句,并通过数据连接器处理物理资源的管理。publicclassConcrateDataAccessorimplementsDao{publicConcrateDataAccessor(ConnectionManagerconnectionManager){//获得连接}publicListread(Stringtable,String[]column,HashMapconditions)throwsSQLException;-41- 基于设计模式的数据访问研究与应用publicvoidinsert(Stringtable,Listrows)throwsSQLException;publicvoidupdate(Stringtable,RowselectedRow,RowupdateRow)throwsSQLException;publicvoiddelete(Stringtable,RowselectedRow)throwsSQLException;}(3)主动域对象层本文中,主动域对象是基于数据访问器层实现的把自身映射到物理数据模型。代码如下:publicclassList{publicList()throwsDataException{……}}5.3应用案例一一学生课程与成绩管理系统的设计开发学生课程与成绩管理系统是整个教务管理系统的子系统,在教务管理中具有举足轻重的地位。该系统方便了学生选课和查分,方便了教学管理和学生成绩的录入,更方便了学校的教务管理。因此对于该类系统,采用合理的设计模式,可以更好的组织整个系统的结构。而学生课程与成绩管理系统也是5.2节中所提模型的一个很好的应用,通过层次模型的设计,不仅可以有效的简化设计开发工作的过程,而且提高系统的整体效率。5.3.1系统功能介绍该系统的设计目的是将学生选择的课程和学生成绩通过网络进行管理,其具体功能模块如下图5.6所示。学生课程管理系统学生教师管理员修修查改公改学教班课选询个布个生师级程课成人成人管管管管绩信绩信理理理理息息图5.6学生成绩管理系统功能图示-42- 中南民族大学硕士学位论文1.管理员功能管理员要进行学生、教师、课程和班级的数据的初始化,主要负责将学生、教师的信息输入到系统数据库中,并进行管理工作,具体功能有:(1)登录——登录到系统中。(2)学生管理——查看列表、增加、修改和删除操作。(3)教师管理——查看列表、增加、修改和删除操作。(4)班级管理——查看列表、增加、修改和删除操作。2.学生功能学生根据学号和密码登录系统,初始密码由管理员提供,学生登录成功后,可以修改个人信息、选课以及查询成绩,因此具体实现功能包括:(1)登录——登录到系统中。(2)学分——查看成绩。(3)个人信息——修改操作。3.教师功能教师根据教师号和密码登录系统,初始密码由管理员提供,教师登录成功后,可以选择学习本门课程的学生和给学生学分,因此具体实现功能包括:(1)登录——登录到系统中。(2)选择学生——课程列表、学生列表、选择。(3)公布学分——课程列表、学生列表、成绩。5.3.2设计开发过程在学生课程与成绩管理系统的设计开发中,本文以基于设计模式(重点是数据访问模式)的Struts三层体系结构模型为参考模型进行系统的设计与实现,采用优化的DAO模式、ADO模式等,以实现高可扩展性、高可维护性和好的可移植性系统。本文以用户之一管理员功能为例,简要介绍关于该系统的设计开发。1.视图组件视图组件用于接收用户(学生、教师、管理员)输入的信息,并显示运行后的结果。该组件由一组JSP文件组成,如用户的登录界面、学生功能选择界面、教师功能选择界面和管理员功能选择界面。所有用户的登录界面的界面设计如图5.7所示。-43- 基于设计模式的数据访问研究与应用图5.7系统登录界面管理员登录界面如图5.8所示。图5.8管理员登录界面管理员增加教师信息界面如图5.9所示。图5.9管理员增加教师信息界面-44- 中南民族大学硕士学位论文教师相关信息显示界面如图5.10所示。图5.10教师相关信息显示界面2.模型组件在登录功能模块中,ActionForm类——TeacherForm用于接收视图组件传递过来的表单信息,并将它传递给Controller组件。具体代码如下:publicclassTeacherFormextendsActionForm{privatestaticfinallongserialVersionUID=8781453346180822209L;privateStringid;privateStringname;privateStringpassword;privateStringtitle;privateSetclasseses=newHashSet(0);publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){returnnull;}publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){}publicTeacherForm(){}publicTeacherForm(Stringname,Stringpassword,Stringtitle,Setclasseses){this.name=name;this.password=password;this.title=title;this.classeses=classeses;}……//设置id;name;password,title,classes的get,set方法}3.控制组件在登录功能模块中,有个Action类——AddTeacher实现业务层向低层插入数据的功能。-45- 基于设计模式的数据访问研究与应用publicclassAddTeacherextendsAction{privateTeacherDAOstuDao;publicTeacherDAOgetTeacherDAO(){returnTeacherProxy;//添加代理模式}publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){TeacherFormstuForm=(TeacherForm)form;stuDao=this.getTeacherDAO();Teacherstu=newTeacher();stu.setId(stuForm.getId());stu.setName(stuForm.getName());stu.setPassword(stuForm.getPassword());stu.setTitle(stuForm.getTitle());if(stuDao.saveTeacher(stu)){return(mapping.findForward("success"));}return(mapping.getInputForward());}}代理类的代码如下:publicclassTeacherProxy{publicstaticTeachergetTeacher(){TeacherDaoteaDao=(TeacherDao)DAOFactory.getTeacher(){ReturnteaDao.createTeacherDAO();}}}4.数据访问层开发(1)用于创建不同对象的DAO接口的DAOFactory类publicabstractclassDAOFactory{privatestaticObjectinitLock=newObject();privatestaticDAOFactoryfactory=null;publicstaticfinalConnectManagerconnectionManager=ConnectManagerImp();publicstaticDAOFactorygetInstance(){if(factory==null){synchronized(initLock){if(factory==null){StringclassNameProp=DAOConfig.getProperty("DAOFactory.className");if(classNameProp!=null){className=classNameProp;}try{Classc=Class.forName(className);factory=(DAOFactory)c.newInstance();}catch(Exceptione){System.err.println("FailedtoloadDAOFactoryclass"-46- 中南民族大学硕士学位论文+className+".StuMancannotfunctionnormally.");e.printStackTrace();returnnull;}}}}returnfactory;}publicabstractStudentDAOcreateStudentDAO();publicabstractTeacherDAOcreateTeacherDAO();publicabstractAdminDAOcreateAdminDAO();publicabstractCourseDAOcreateCourseDAO();publicabstractClassesDAOcreateClassesDAO();publicabstractEnrolDAOcreateEnrolDAO();}(2)用于读取配置文件dao-config.propertes的内容的类,并实现加载制定的接口和实现类的功能。publicclassDAOConfig{privatestaticPropertiesprops=null;privatesynchronizedstaticvoidloadProperties(){props=newProperties();try{InputStreaminput=DAOConfig.class.getResourceAsStream("/daoconfig.properties");props.load(input);}catch(Exceptione){e.printStackTrace();}}publicstaticStringgetProperty(StringpropName){loadProperties();returnprops.getProperty(propName);}}(3)TeacherDAO接口publicinterfaceTeacherDAO{ListgetTeacher(Stingid,String[]columns,RowselectionRow,String[]sortColumns);booleandeleteTeacherByID(Stringid,RowselectionRow);booleanupdateTeacher(Teacherstu,RowselectionRow,RowupdateRow);booleansaveTeacher(Teacherstu);TeachergetTeacherByID(Stringid);}(4)TeacherDAOImp-DAO实现publicclassTeacherDAOImpimplementsTeacherDAO{privateConnectionManagerconnectionmanager;;publicTeacherDAOImp(ConnectionManagerconnectionmanager){-47- 基于设计模式的数据访问研究与应用this.connectionmanager=connectionmanager;publicListgetTeacher(Stingid,String[]columns,RowselectionRow,String[]sortColumns){try{StringBufferbuffer=newStringBuffer();Buffer.append(“SELECT”);if(columns!=null){for(inti=0;i0){buffer.append(“,”);buffer.append(columns[i]);}}}elsebuffer.append(“*”);buffer.append(“From”);buffer.append(resolveQualifiedTable(stu));if(selectRow!=null)buffer.append(generateWhereClause(selectionRow));}……}booleandeleteTeacherByID(Stringid,RowselectionRow){……}booleanupdateTeacher(Teacherstu,RowselectionRow,RowupdateRow){……}booleansaveTeacher(Teacherstu){……}TeachergetTeacherByID(Stringid){……}}}5.连接器管理层主要代码publicinterfaceConnectionManager{ResultSetexecuteQuery(StringdataSourceStringsql);intexexuteUpdate(StringdataSourceStringsql);publicclassConnectionManagerImpimplementsConnectionManager{ResultSetexecuteQuery(StringdataSourceStringsql){Connectionconnection=resolveConnection(dataSource);Statementstatement=connection.createStatement();returnstatement.executeQuery(sql);}intexexuteUpdate(StringdataSourceStringsql){Connectionconnection=resolveConnection(dataSource);Statementstatement=connection.createStatement();-48- 中南民族大学硕士学位论文introwsUpdates=statement.executeUpdate(sql);statement.close();returnrowsUpdates;}privateConnectionresolveConnection(StringdataSource){synchronized(connections){Connectionconnection=(Connection)connections.get(dataSource);if(connection=null){connection=DriverManager.getConnection(“jdbc:subprotocol:”+dataSource,UserName,Password);connections.put(dataSource,connection)}returnconnection;}}}}6.配置文件说明对于用户登录功能和管理员管理教师的功能的配置,分别如图5.11,5.12所示。图5.11用户登录功能配置图-49- 基于设计模式的数据访问研究与应用图5.12管理员管理教师的功能配置图学生课程与成绩管理系统是以基于正交组件的层模式的框架为基础进行开发的。在开发过程中应用了DAO、ADO、AbstractFactory和Proxy等模式。通过运用设计模式,使得该系统更加快捷、灵活,达到了预期的目标。通过在实践过程中发现问题,解决问题,不但验证了基于正交组件的层模式的关于数据访问层模型的可行性,而且从细节上验证了数据访问层组件,业务逻辑层和视图层设计的合理性。-50- 中南民族大学硕士学位论文总结与展望所谓模式是一种方案,利用这种方案,人们可以完成某项工作;模式也是一种途径,通过这种途径,人们可以达到某种目的;同时,一个模式也是一种技术,为了完成某项工作,人们必须获取并利用有效的技术。设计模式就是能够重复应用于多个问题的解决方案,而且是经历了时间的考验,已经证明其优秀的解决方案。它提供了通用的、可重用的设计,在设计层次上解决问题。为一类相似的问题提供了经过验证和测试的解决方案。而数据访问模式就是在数据访问领域起到设计模式的用的模式。本文由面向对象应用中的普遍问题如数据访问的过多细节使得应用的代码难以很好编写和维护,阻抗不匹配等引入,主要研究以下内容:(1)对模式,设计模式等相关基础知识进行深入研究。(2)对数据访问层以及其中的数据访问对象模式、主动域模式和连接池模式进行分析和对比并深入研究基于层模式的正交组件的数据访问层的多种设计模式。(3)结合数据访问层的多种设计模式,提出一种轻量级的对象持久层框架的设计,通过轻量级对象持久层框架结合Struts的Web应用开发,实现程序的高维护性,高可靠性以及很好的移植性,从而验证该框架的有效性和实用性。面向对象思想的关键是抽象,设计模式是一定抽象的结果。所以我们在进行面向对象的分析设计过程中,要充分理解抽象的作用和重要性,学习遵循面向对象的设计原则,再加上灵活运用设计模式,能够极大的提高软件的设计水平,才能真正做到设计可复用的面向对象的程序的目标。面向对象技术以及设计模式带来了软件开发的大革命,大大的加快了软件技术发展的步伐。但是它们并不是解决一切软件问题的方法,采用面向对象技术带来的复杂性和效率问题仍然是人们争论的焦点。著名建筑大师ChristopherAlexander所提出的模式概念被证明在解决相同软件问题方面非常有用,但是作为一个新兴的计算机研究领域,还有大量的工作需要去做。如何最大限度的发挥面向对象技术和设计模式的优越性,避免它们的弱点就是现今的重要研究任务。--51 基于设计模式的数据访问研究与应用参考文献[1]ChristopherAlexander、IshikawaS.APatternLanguage,NewYork[M].oxfordUniversityPress,1977:3-8[2]GammaE,HelmR,JohnsonR,VlissidesJ.设计模式:可复用面向对象软件的基础[M].李英军,马晓星,蔡敏,刘建中,机械工业出版社,2000[3]McConnells.,CodeComplete:APracticalHandbookofSoftwareConstruction,Redmond[M].MicrosoftPress,1993:81-87[4]RogerSmith.DefiningtheUML.Kernel.http://www.sdmagazine.com/,2000.10[5]ALAN,SHALLOWAY,JAMESR.TROTT.DesignPatternExplained设计模式解析.徐言声.第二版[M].人民邮电出版社,2006:8-11[6]冯相忠.基于MVC设计模式的Struts框架及其应用的研究[J].计算机技术与发展,2006,(08):131-136[7]孙卫琴.精通Struts基于MVC的JavaWeb设计与开发[M].电子工业出版社,2004[8]孙凌燕,陈保岚,孙健.基于Struts的Web应用框架设计与研究[J].计算机工程,2005,31(8):57-60[9]孙更新,周峰.白领就业指南J2EE开发人员成长之路[M].电子工业出版社,2006[10]阁宏.Java与模式[M].电子工业出版社,2002[11]ChristopherAlexander.TheTimelessWayofBuilding,NewYork[M].oxfordUniversityPress,1979:368-387[12]MeyerBertrand,Object-OrientedSoftwareConstruction,UpperSaddleKiver,NJ[M].PrenticeHall,1997:57-60[13]MartinB.AgileSoftwareDevelopment:patternsandPractices,UpperSaddleRiver,N.J[M].PrenticeHall,2003:127-129[14]设计模式:可复用面向对象软件的基础/伽玛等著[M].李英军等译,机械工业出版社,2000[15]结成浩.设计模式-java语言中的应用[M].博硕文化,中国铁道出版社.2005[16]杨芙清,梅宏,李克勤.软件复用与软件构件技术[J].电子学报.1999,27(2):68-75[17]莫勇腾.深入浅出设计模式[M].清华大学出版社,2006,96-104[18]徐勇,张中兆,吴斌.资源管理系统轻量级DAO模式的设计与实现[J].吉林大学学报(信息科学版),2004(22):521~525-52- 中南民族大学硕士学位论文[19]朱曦,钟珞,彭钰等.基于Java和DAO设计模式的网上购物系统的实现[J].信息技术,2005(12):120~122[20]李立春,刘卓.数据库连接池设计[J].吉林化工学院学报,2006,(02)55-56,59[21]魏勇,唐文彬,郭梅等.基于DAO模式的J2EE应用程序的数据库访问设计[J].计算机应用,2003-12,23:356~357[22]DanijelMatid,DinoButoracandHrvojeKegalj.DataAccessArchitectureinObjectOrientedApplicationsUsingDesignPatterns[J].IEEE.2004-05:595~598[23]江豫京,王宇,王普等.设计模式在CAS系统的数据库引擎中的应用[J].计算机应用,2004.2,24(2):151~153[24]崔仂.几种经典设计模式组合的参考架构[J].研究与开发,2004(14):79~82[25]梁文娟,郑逢斌,杜莹等.抽象工厂模式在.net多层分布式程序中的应用[J].ComputerEra,2006(3):27~29[26]吴永辉.用于XML模式和DTD规范化设计的层次模式设计[J].软件学报,2004,15(7):1099~1106[27]伊芸芸,宋中山.基于正交组件的数据访问模式[J].中南民族大学学报(自然科学版),2006,25(4):67-69[28]IvarJ,MartinG.SoftwareReuse[M].世界图书出版公司,1997:58-194[29]邱哲,王俊标,马斗.StrutsWeb设计与开发大全[M].清华大学出版社,2006(2)[30]张大治,应群.精通Eclipse[M].清华大学出版社,2006[31]HugbE.Williams&DavidLane.PHP&MySQLWeb数据库应用[M].东南大学出版社,2006[32]王樱,徐雨明.VC++中数据库访问技术研究[J].微型计算机信息,2006,22(4-3):256-258[33]SunMicrosystems.DataAccessObject.http://java.sun.com/bluopints/patterns/DAO.html,2002-53- 中南民族大学硕士学位论文致谢首先要感谢我的导师宋中山副教授,本论文是在导师的悉心指导下完成的。从本文的开题阶段,到后来的论文准备,撰写一直到修改阶段,宋老师多次与我进行交流并给予详细的指点,使得毕业论文在经过一年多的撰写之后,终于顺利完成。导师高尚的品德、渊博的知识、忘我的工作热情、严谨的治学态度、敏锐的洞察力都给了我莫大的教育和深刻的影响,使得我终身受益。他宽宏的处事作风无时不在激励着我不断进取,宋老师不但是我从事科学研究的导师,学习的益友,更是我生活的楷模。在此,谨向导师致以衷心的感谢!感谢计算机科学学院的所有老师,非常感谢你们在三年的研究生学习阶段对我的关怀和教诲。感谢实验室的各位同学在学习上对我的帮助和鼓励,感谢蓝庆青同学对我各方面的关心照顾,很高兴和你们一起度过开心而难忘的三年。更不能让我忘记的是,在多年的求学生涯中,我的父母家人对我无微不至的关怀和强有力的支持,祝愿你们幸福安康!感谢所有关心和支持过我的老师、同学、朋友和亲人。伊芸芸2007年5月20日--54

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭