集成wsh架构技术的web应用研究与实现

集成wsh架构技术的web应用研究与实现

ID:34637661

大小:2.63 MB

页数:88页

时间:2019-03-08

上传者:jjuclb
集成wsh架构技术的web应用研究与实现_第1页
集成wsh架构技术的web应用研究与实现_第2页
集成wsh架构技术的web应用研究与实现_第3页
集成wsh架构技术的web应用研究与实现_第4页
集成wsh架构技术的web应用研究与实现_第5页
资源描述:

《集成wsh架构技术的web应用研究与实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

西南交通大学硕士学位论文集成WSH架构技术的Web应用研究与实现姓名:马崇启申请学位级别:硕士专业:计算机应用技术指导教师:黄洪20070301 西南交通大学硕士研究生学位论文第l页摘要随着互联网技术的飞速发展,基于B/S模式的Web应用系统受到越来越广泛的关注。面对以往普遍存在的程序可重用度低、维护任务繁重、扩展性差等问题,如何快速构建稳定、高效、可扩展性和维护性强的应用系统给众多开发人员提出了挑战。诚然,J2EE平台为企业级应用定制了解决方案,而实现该方案的Web技术和框架琳琅满目、各具特色,如何针对具体应用搭建各层框架以及选用最合理的技术是设计开发的关键。在Web开发领域,MVC模式无疑是最吸引人的,它很好的将界面表示、业务逻辑和企业数据模型相隔离,使各应用层以松散耦合的方式彼此作用。WebWork是一个致力于组件化和代码重用的拉出式MVC模式实现框架,以其灵活、强大的功能为Web应用的构建减轻了负担。Spring是一种轻量级的容器,区别于EJB的强侵入式,Spring的依赖注入动态的使系统各组件间达到松散耦合并且能和其他框架良好的兼容。Hibernate是一个开源的持久层框架技术,全面减轻了维护数据的复杂度,使系统具有良好的性能和移植性。本文以作者参与的四川省乐由大佛电子商务平台开发项目为背景,在对系统进行全面需求分析的基础上,分别对Web层、业务逻辑层、数据持久层进行了详细设计。针对项目特点,在对比了多种框架技术的优势后,整合WebWork、S研ng和Hibernate三种框架技术,提出了一个具有通用模式的J2EE架构:WebWork实现MVC模式完成Web表示层功能,其业务逻辑交由Spring来管理;Spring负责管理表现层控制器与数据访问对象问关系,完成业务逻辑层功能;Hibernate负责数据的持久化工作。实现过程中融合了大量兼容技术如Ajax、Acegi、Freemarker,并设计开发了一系列可重用模板,单元测试和集成测试表明,系统满足设计需求。综上所述,文章在对各种主流框架技术深入分析的基础上,提出了集成WebWork、Spririg、Hibernate三种框架技术的J2EE架构,不但能够有效地解决传统Web应用开发中存在的问题,而且采用分层及模块化设计使系统具有很高的可维护性、扩展性、移植性和组件的复用性。关键词:J2EE;架构;框架;设计模式;软件重用 西南交通大学硕士研究生学位论文第1I页AbstractWiththerapiddevelopmentofInternet,theWebapplicationsystembasedonBrowser/Serverispaidwiderlyattention.Facedtoproblemswhichareubiquitoussuchaslowreusability,expansibilityandheavymaintenancework,howtobuildanapplicationsystemwhichisstable,efficient,higllexpansibilityandmaintainabilitychallengemanydevelopers.Indaed'J2EEplatformestablishedsolutionforEnterpriseApplication,butthereareanumberofWebtechnologiesandframeworksimplementthatschema.Thekeyliesinhowtoassembleexistingfi-arneworkandselectsthemostreasonableteehnologyforthespecialapplication.InWebdomain,thereisnodoubtthatMVCpatternisthemostattractive,whichseparatethewholeapplicationintoUserInterfacepresentation,businesslogicandenterprisedatamodelandmakeeachlayerinteractinloosecouplingway.WebWorkisapull-outframeworkofimplementingMVCpattemandstrivesforreusingmoduleandcode,itrelievesbllrdenforconstructingWebapplicationbyitsflexibleandpowerfulfunction.DifferentiatingstronginvasionofEJB,Springwhichisalightweightcontainerisdesignedwithdependencyinjectionandcanmakecomponentloosecouplingdynamicallyandcompatiblewithotherframework.Hibernateisanopen-sourcepersistenceframework,whichentirelyreducesthecomplexityofmaintainingdataandmakesystemhavehigherperformanceandportable.ThispapertakestheprojeetofSichanprovinceLeShanGiantBuddhaEBSasanexample,Inwhichtheauthorhasbeeninvolved.TodetaileddesignforeachlayersuchasWebtier,businesslogictieranddatapersistencetierbasedonrequirementanalysiscompletely.Asforthecharacteristicofproject,aftercomparedadvantagesofallsortsofframeworktechnologies.theauthorintegratedwithWebWork,SpringandHibernateandputforwardageneralmodelofJ2EEarchitecture,whatisthatWebWorkwhichimplementedMVCpatternplaytheroleofWebpresentationtierandhandoveritsbusinesslogictoSpring,manageobjects’relationofbetweencontrolleranddataaccessobjectthroughSpringandmakedatapersistencebyHibernate.Intheprocessofcarryingout,thearchitectureutilizesmanycompatibletechnologiessuchasAjax,Ace#andFreemarker,anddevelopsaseriesofreusabletemplates.AfterUnittestandIntegraltest,thesystemisbasicallysatisfiedall 西南交通大学硕士研究生学位论文第1II页requirements.Inconclusion.,thisthesismadediddeepanalysisofmanypopularframeworksandofferaJ2EEarchitectureofintegratingWebwork,SpringandHibernate,whichnotonlymakeupfortraditionalshortagesinWebdesignbutalsoenhancethesystem’smaintainability,expansibility,compatibilityandreusabilitythroughadoptingdelaminationandmodularization.KeyWord:J2EE,Architecture,Framework,Designpattern,SottwareReusability 西南交通大学硕士研究生学位论文第1页第1章绪论1.1课题研究背景及意义互联网——这个家喻户晓的名字己经完全融入我们的生活,随着网络技术的不断发展,网络对人们的日常生活,社会的经济、政治等都产生了重大影响。网络影响的广度表现为接触网络群体形形色色,以个体、家庭、企事业为单位。从网络影响深度来看,网络对人们的语言、价值观、行为方式、文化等深层次影响也在不断增强。同时互联网构造了无限的信息资源,网络信息管理、全球信息共享,永久信息存储,信息数据挖掘等等,它的普遍使用已经从根本上改变了人们的生活方式和工作方式,也改变了企业的经营方式和服务方式。Intemet的发展惠及于社会生活的各个领域,网络安全技术的快速发展和成熟,商业领域的销售、交易、网络等各个领域都正在发生着空前的革命性的变化,越来越多的企业和商家都想借助于Intemet的无国界、无时间、无地域限制的便利环境来经营拓展业务。电子商务这一新型商务模式已得到世界各国的普遍关注,它不仅仅是Intemet在商务领域的应用,更是一种新型的商务模式,它的推广彻底改变了传统的旧的商务模式,引发一场新经济革命。所谓电子商务(ElectronicCommerce)是利用计算机技术、网络技术和远程通信技术,实现整个商务过程中的电子化、数字化和网络化。它是90年代初在欧美兴起的一种全新商业交易模式,从售前服务至0售后服务的相关各个环节全部或部分实现电子化、网络化、自动化及高效化。从客户角度说,电子商务给人们的生活带来了极大的便利,人们可以足不出户的浏览所有商品,选择、购买、支付完全在网上完成。电子商务在发达国家的发展空前繁荣,通过互联网进行交易已成为商业发展的必然趋势。基于电子商务而推出的种种解决方案,如商品交易系统方案、金融电子化方案等,己形成了多种新型相关产业,给信息技术带来了新的机遇。在我国,电子商务始于1997年。中国商品订货系统(CGos)、中国商品交易中心(CCEC)、虚拟“广交会”等大型电子商务项目在1997年相继推出,拉开了中国电子商务的序幕。在可以想象的未来,我国的电子商务的前景和市场需求相当广阔。基于电子商务的重大意义,其应用开发也就显得尤为重要。因此,如何进行电子商务的应用开发,如何方便、快捷地构造出企业级电子商务应用 西南交通大学硕士研究生学位论文第2页系统己成为一个目前急需解决的课题。最近几年,随着网络技术的迅速发展和各种平台技术的广泛采用,基于Web技术、尤其是多层Web技术开发电子商务系统越来越成熟,并逐步为大众所接受。基于J2EE平台的应用由于其良好的跨平台性,受到众多开发人员的青睐。与此同时,电子商务的发展对传统的Web技术提出了强有力的挑战。由于电子商务信息处理的内部逻辑复杂,安全性要求苛刻,商务模式发展变化快,开发周期越来越短,这就要求Web技术提供足够的复杂度和灵活性以适应电子商务的需求。要满足包括电子商务系统在内的Web应用系统的要求,现有的技术参差不齐。Web技术从最初的发布静态信息,到如今可以实现动态的交互功能,的确走了一段很长的路。在专业技术人员的共同努力下,Web应用开发先后出现了CGI、PHP及JSP技术等,这些技术的产生大大减轻了Web编程的难度。但是它们有一个共同的弱点,显示结构和业务逻辑混杂。这就意味着,业务模型的独立性和模型的重用很难得到体现,在各开发团队之间相互依赖,很难独立、并行开发项目,经常是每修改一处,就要影响到其他团队的正常工作,牵一发而动全身,大大限制了开发人员的灵活性和开发进度,并延长了开发周期。此外代码的可读性、可维护性和可扩展性都非常差,不利于后续的开发和维护工作,很难满足用户的变化性需求。综上所述,在现有的Web开发技术中,普遍存在着程序可重用程度低、维护工作繁琐、应变能力弱等不足。而且,目前Web应用的需求越来越复杂,开发周期越来越紧迫,同时对系统的稳定性、扩展性和可维护性要求越来越高,因此如何将混杂的模式进行合理的分层以及各层的框架搭建和技术选择就变得尤为重要。1.2国内外文献综述Web应用的广泛性推动了软件技术的发展,同样软件技术发展促进Web应用更加广泛。今天的软件,规模不断扩大、复杂度日渐升级、开发人员面临的问题越来越多、解决方案也百花齐放。即使是利用先进的J2EE软件平台,在多层Web体系结构的设计中,同样面临程序重用度低,维护性、兼容性和扩展性差等不足。Web应用软件需要面对异构的网络环境、多样化的用户需求、灵活的业务模式、复杂的业务流程、众多的组织机构及层次、角色分工等问题。因此,如何设计应用软件僮纷杂的应用需求和多样化的客观环境能够彼此尽量少 西南交通大学硕士研究生学位论文第3页的受到对方的干扰和牵制,以及我们曾经的成功案例能否再次使用?分层结构和组件复用给众多开发人员提供了选择。分层结构让系统的功能更加明确,减少了各层次之间的关联和依赖,让开发人员可以同步工作而尽量少的受到其他人的影响,甚至可以让不懂程序代码的人同样参与程序开发。组件复用是在分层的基础上,由于层间的耦合性低,独立性强,对于以往成功的案例和功能重复的组件直接使用,极大的提高了软件的开发效率、缩短了开发周期,而且在成熟组件的基础上开发,使软件产品的稳定性、兼容性、扩展性都得到了提高。因此,人们越来越意识到软件重用技术的重要性,设计模式和框架技术应运而生。开源社区的发展壮大,开源软件、框架技术更是层出不穷。设计模式和框架技术在整个系统开发中发挥了重要的作用,但从更广泛的角度说,它们只是在更小的颗粒度上发挥功用。如何组织各个层次、如何合理选择使用模式和框架技术又将开发人员的关注点提高到整个系统层面上来。架构技术为这一问题提供了解决方案。架构是软件系统从整体到部分的最高层次的划分,一般由多个不同领域的框架组成。一个成功的软件需要有一个成功的架构,它将各个框架技术有机的组织起来,相互关联但又不失其独立性。软件架构的建立是一个复杂而又持续改进的过程,开发人员不可能对每个项目做不同的架构,而总是尽量重用以前的架构,或开发出尽量通用的架构方案。如何在众多的框架中选择建立适合企业应用的架构,并且怎样让各个应用层无缝连接?如何整合框架以便让各个层以一种松散耦合的方式彼此作用而不用管底层的技术细节?这给软件人员提出了挑战。1.3课题的来源及主要研究内容1.3.1课题来源北京迈普世纪科技有限公司成都分公司四川省乐山大佛电子商务平台项目1.3.2本论文主要内容和结构本论文在分析了现有框架技术的基础上,对WebWork、Spring和Hibernate框架进行整合,使其形成一个具有一定集成度和通用性的软件开发架构。通过对乐山大佛电子商务平台项目的实施,验证WSH(本文中WSH为Webwork,Spring,Hibernate三种框架技术的简称)框架满足项目设计要求,并结合项目实践中的具体问题,提出思路及解决方案。 西南交通大学硕士研究生学位论文第4页第1章绪论本章主要介绍了课题的研究背景、意义和主要内容,并简要介绍了软件框架技术和目前Web应用中所面临的主要问题。第2章J2EE框架和MVC模式本章对J2EE平台框架和MVC模式进行研究。对目前较为流行的几种MVC实现框架进行了分析对比,确定以WebWork作为优选方案。第3章WSH应用框架本章对WebWork、Spring和Hibernate框架进行深入分析,提出了三种框架技术整合的优越性。第4章基于WStt技术的Web架构设计本章提出了集成WebWork,Spring和Hibernate的架构设计方案,定性的分析了三种框架技术在J2EE框架中的位置。重点讨论三种框架技术的整合,对实现技术做了一定的归纳分析,为Web应用实现提供选择性参考。第5章乐山大佛电子商务平台分析与设计本章主要以四川省乐山大佛电子商务平台项目为例,通过对该项目详细的需求分析,提炼出了系统的结构模型以及各模型之问的关系,确定整个系统采用上述WSH体系结构进行分层及模块化设计。第6章WSH架构在电子商务系统中的实现本章应用WSH架构对乐山大佛电子商务平台的各层的典型功能进行实现,提炼出可重用组件,对实现架构的安全性进行探讨。最后结合项目开发中遇到的实际问题和解决方法,对WSH集成架构的特点进行了分析和归纳,力求使其形成一个具有一定集成度和通用性的软件开发架构。最后概括总结了作者在应用该架构进行项目实施中的体会以及不足,并提出今后需要进一步研究和发展的方向。 西南交通大学硕士研究生学位论文第5页第2章J2EE框架和MVC模式2.1J2EE架构J2EE(Java2EnterpriseEdition)是建立在Java2平台上的企业级应用的解决方案。目前,Java2平台有3个版本,它们是适用于小型设备和智能卡的Micro版(J2ME)、适用于桌面系统的标准版(J2SE)、适用于创建服务器应用程序和服务的企业版(J2EE)。J2EE技术的基础是核心Java2的标准版,J2EE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的JDBCAPI、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对EJB、JavaServletsAPI、JSP以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。事实上,J2EE已经成为企业级开发的工业标准和首选平台。J2EE并非一个产品,而是一系列的标准。符合这个标准的产品叫“实现”;其中SUN公司的J2EE开发包中就有一个这样的“实现”,市场上也可以看到很多实现了J2EE的产品,如BEAWebLogic,IBMWebSphere以及开源的JBoss等等。2.1.2J2EE体系结构J2EE体系结构提供中间层集成框架来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用需求。通过提供统一开发平台,J2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序的强有力支持,完全支持EnterpriseJavaBeans,有良好的向导支持打包和部署应用,添加目录支持,增强了安全机制,提高了性能,是传统的互联网应用程序模型无法比拟的。J2EE是多层的分布式应用模型,应用逻辑按功能划分为组件,各个应用组件根据他们所在的层分布在不同的机器上(也可以放在同一台机器上)。解决两层模式(Client/Server)弊端,在传统模式中,客户端担当了过多的角色而显得臃肿,在这种模式中,第一次部署的时候比较容易,但难于升级或改进,可伸展性也不理想,而且经常基于某种专有的协议(通常是某种数据库协议)。它使得重用业务逻辑和界面组件非常困难。现在J2EE的多层企业级应用模型将两层化模型中的不同层面切分成许多层。一个多层化应用能够为不同的每种 西南交通大学硕士研究生学位论文第6页服务提供一个独立的层,以下是J2EE典型的四层结构:客户层cli删w曲表示层业务逻辑层l企业信息系统层EISE】日容器磬w曲容嚣∞JSp月∞JeveMail^』mCV—∥JlⅧJACC应鬻端pJAAXJ2EE纠afform答尸机oJ2EE撇务抬EIS服务需图2-1J2EE架构应用程序●客户层组件:J2EE应用程序可以是基于web方式,也可以是基于传统桌面应用方式。●Web表示层组件:Web表示层位于J2EE服务器中,主要由Web容器进行管理,可以是JSP页面或Servlets。按照J2EE规范,静态的HTML页面和Applcts不算是web层组件。●业务层组件:业务层逻辑由EJB容器来管理,主要由运行在业务层上的EnterpriseBean进行处理并发送到EIS层进行储存,这个过程也可以逆向进行。而往往经常由图3所示的几个服务(如JDBC、JNDI等)协作完成。●企业信息系统层:企业信息系统层处理企业信息系统软件包括企业基础建设系统例如企业资源计划(ERP),大型机事务处理,数据库系统和其它的遗留信息系统.2.1.3J2EE架构的扩展一一五层架构实现前以述及,J2EE的四层体系结构很好满足了web应用及桌面应用的需要,客户层主要用于人机交互;表示层负责响应客户请求、调用业务层组件并将结果返回到客户层;业务层主要负责应用逻辑实现,数据库访问和事务处理;数据库层主要负责数据的存储和组织、分布管理等。但是在实际应用中,四层的划分往往不能完全准确的指导开发,主要问题出在业务逻辑层和数据库层之间。业务逻辑层与数据库的交互过程中往往需要 西南交通大学硕士研究生学位论文第7页对数据库调用接口做迸一步的封装,所以我们人为的在两层之间加上一个数据持久层,其位于数据库之上,隐藏数据的读取和操纵中的所有数据访问代码细节,完全抽象出使用数据的物理细节。同时在后续章节中,还要详细介绍数据持久层框架技术即Hibernate框架,有效的实现O/R(对象/关系)映射机制,极大的简化了对数据库的操作。五层结构如图2-2所示:,、,、,、Web业数表/L—』务据一逻/LJ持不、r叫\r叫层辑久层\/2.2驸C模式介绍图2—2J2EE五层结构图2.2.1什么是MVC模式模型一视图一控制器(Model—View.Controller)是XeroxPARC在八十年代为编程语言Smalltalk--80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的青睐。MVC模式最初被Smalltalk社区开发出来主要用于解决桌面GuI应用⋯,。MVC模式并非传统意义上的设计模式,确切的说应该是一个架构模式,是一个复杂的架构模式,其实现也较普通模式复杂。但是,我们已经总结出了很多可靠的设计模式,多种设计模式结合在一起,使MVC模式的实现变得相对简单易行。Views可以看作一棵树,显然可以用CompositePattern(组合模式)来实现。Views和Models之间的关系可以用ObserverPattern(观察者模式)体现。Controller控制Views的显示,可以用StrategyPattern(策略模式)实现。Model通常是一个调停者,可采用MediatorPattern(中介者模式)来实现。总之,如果要完全从设计模式的概念出发来阐述MvC,可能要使用GOF的23种设计模式中的几种甚至十几种了。在介绍MVC模式之前,我们先看看MVC的起源,这有助于我们对MVC模式更好的理解。 西南交通大学硕士研究生学位论文第8页图2—3传统的MVC模式图2.3显示了传统MVC模式的事件流,用户与视图交互,填充数据并点击提交按钮。控制器从视图上接收事件并在模型上执行动作,使用用户提供的数据更新模型。当模型数据更改后,模型改变事件通知视图将动作后的结果显示给用户。通过注册更多的监听器,可以使多个视图和控制器共享相同的模型数据。虽然传统MVC模式在桌面应用程序中取得了很大的成功,然而在web世界没那么得心应手了。图2—3显示了非常清晰的设计方法,不幸的是它在由HTTP和HTML组成的世界里,并不能很好的工作。那些使用HTTPRequest/Response模型的Web应用,需要另一种的模式。如图24所示:图2-4MVC模式Web应用框架事件流在MVC的Wcb版本中,视图并不能象图2.3中显示的那样直接调用控制器,丽是映射成基于URL(统一资源定位符)的Web请求。当客户端有一个新的请求时,视图并不是一个能被更新的对象,而仅仅是一个能被重绘的Web页面。模型也不会因为发生了改变而通知视图,因为视图的渲染是在一个不同的客户机的用户浏览器上,因此视图被强迫用最新的数据重新渲染。应用于web世界的MVC模式使用FrontController(前端控制器)模式,它主 西南交通大学硕士研究生学位论文第9页要包含一个分配器将URL请求映射给将被执行的命令对象,这些命令对象就是在WebWork或Struts中的Actions,它们同后端的系统服务进行交互,这些系统服务统称为模型。命令对象被处理完成后,返回一个值,该值被映射到一个视图,该视图使用标签来获得所需要的数据。前端控制器的出现为处理安全关注、适当的用户管理以及应用流程的集中管理提供了唯一的访问点。下面详细说明各部分的作用:视图:代表用户交互界面,对于Web应用来说,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Flash和象XHTML,XML/XSL,WML等一些标识语言和webservices。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。模型:就是业务流程,状态的处理以及业务规则的制定和企业数据。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子。控制:可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后,并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。总结MVC的处理过程:1.首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理。2.然后模型通过业务逻辑来处理用户的请求并返回数据。3.最后控制器根据返回的结果,调用相应的视图格式化模型(如jsp,FreeMarker等),并通过表示层将处理后的结果呈现给用户。2.2.2为什么要用MVC模式在MVC模式之前,W曲应用程序都是用像ASP,PHP或者CFML这样的过程化语言来创建的。它们将诸如数据库查询语句这样的数据层代码和HTML代码混编在~起。从开发速度上来说,有其便利的方面,但将数据与表示混杂在~起,很难体现出业务模型的独立性和模型的重用。产品设计弹性力 西南交通大学硕士研究生学位论文第10页度小,很难满足用户的变化性需求。从整体上看,开发的时间周期是一条水平线,而扩展和维护的时间周期则是一条逐步增加的曲线。MVC从根本上强制性的将它们分开,尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。首先,最重要的一点是多个视图能共享一个模型,如果需要用更多的方式来访问应用程序,其中一个解决之道是使用MVC,无论用户想要Flash界面或是WAP界面,用~个模型就能处理它们。由于已经将数据和业务规则从表示层分开,所以可以最大化的重用代码。因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。如果想把数据库从MySQL移植到Oracle,或者改变基于RDBMS数据源到LDAP,只需改变模型即可。一旦正确的实现了模型,不管数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想能构造良好的松耦合的构件。2.2.3几种wc实现框架的比较MVC模式从概念上定义了基于web应用的框架技术,同时支持MVC模式的框架技术也是种类繁多,目前比较主流的有Struts,w曲work,SpangMVC,JSF,Tapestry等,至于非主流的就不计其数了。那么面对琳琅满目的框架,究竟该使用那种呢?那种才是最好的昵?笔者认为,对于各神框架技术,不存在绝对的好与不好,而是各有所长,针对不同的应用需求选择合适的框架技术才是上策。下面针对几个主流框架技术进行简单的比较:1.Struts优点:业界“标准”(很多成功案例),学习文档、书籍资源丰富,HTML标签非常优秀,具有广泛的群众基础。缺点:ActionForms使用不便、无法进行单元测试(StrutsTestCase只能用于集成),有些技术显得过时。2.WebWbrk优点:结构简单易于扩展、标签库易于定制、拦截器非常出色,webWork支持广泛的模板语言(Veloeiy和FreeMarker),完整的tag支持,模块写好后容易插入。一个iar包就可以包括所有的action和viCW(得益于ftl的classpath支持),和其他工具兼容性好。缺点:文档示例较少、具有较多的配置 西南交通大学硕士研究生学位论文第11页3.SpringMVC优点:稳定可扩展,支持了i18n、文件上传,异常处理,这些稳定的支持给开发者坚实的基础。与Spring集成,对IoC原生支持。缺点:使用人数少、jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器,不适合需要组件化开发的场景,配置较困难。4.Tapestry优点:对于中等规模或者大规模的应用会带来很多好处,允许创建新的组件,容易与IoC集成,方便进行测试。缺点:Tapestry的学习曲线非常陡峭。它只有漂亮的模板,实现文档太概念化,不利于编程。5.JSF优点:浏览器程序像桌面程序一样工作,J2EE标准、易于开发、丰富的导航框架,并可获得大量第三方支持。缺点:JSP标签差、技术不成熟、不适合大规模的、以读为主的网站。就Struts而言,StrutsAorion1.x确实具备以上的缺点,但Struts工作组的成员已经意识到这些。在各方的共同努力下,Struts,WebWork和Beehive三方宣布合并,共同发展下一代MVC框架StrutsTi(即Struts2)。它将主要以WebWork为核心,集成Beehive的annotataion和pageflow功能,推向Struts用户群体,并且加强和JSF的集成能力。在考虑系统设计时,综合以上各框架的特点,在开源领域,WebWork具有得天独厚的优势,并且将来的StrutsAction2.0即是以WebWork为核心,其内部机制合理,故在选择开发框架时,以WebWork为优选。2.2.4wC与J2EE架构之间的关系理解MVC三个部分在J2EE架构中处于什么位置,有助于我们理解MVC模式的实现。前面提到并提供了一个J2EE体系层次结构图,MVC与J2EE架构间对应关系是:●View处于w曲层和客户端层,通常是JsP/servlets。●Controller也处于Web层,通常用Servlets实现。·Model处于业务逻辑层,通常用服务器端JavaBean或者EJB实现。 西南交通大学硕士研究生学位论文第12页第3章WSH应用框架3.1WebWork框架正如前文所提到的,在MVC模式的实现技术中,Struts是一种流行的Web框架,拥有大量的用户群体,但在构建大规模Web应用的时候,它并不能提供通常所需的创造力发挥空间。W曲w矾(的创造者和JBoss的创始人之一的Rickard0berg曾经说:“框架的强大之处不是源自于它能让你做什么,而是它不能让你做什么”w。Rickard所说的话解释了什么是框架:框架使混乱的东西变得结构化。然而,从另一个角度说,限制严格的架构束缚了开发人员的手脚,开发人员的创造力空间收缩了,甚至有些任务无法完成。很明显,一种完美的中间状态存在于无框架和严格框架之间,这种梦寐以求的中间状态就w曲wbrk的终极目标。WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式的J2EEWeb框架。WebWork目前最新版本是2.2,其前身是Rickard0berg开发的WebWork,但现在WebWork已经被拆分成了Xworkl和W曲Work2两个项目m,。如下图所示:Xwork简洁、灵活且功能强大,它是一个标准的Command模式实现,并且完全从Web层脱离出来。Xwork提供了很多核心功能:前端拦截机、运行时表单属性验证、类型转换、强大的表达式语言(OGNL—theObjectGraphNotationLanguage)、IoC(InversionofControl反转控制)容器等。WebWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使 西南交通大学硕士研究生学位论文第13页用FilterDispatcher(过滤器),将m1.P请求的变成Action(业务层Action类)、session(会话)、application(应用程序)、request请求范围的参数映射。WebWork2支持多视图表示,视图部分可以使用JSP,Velocity,FreeMarker,XML等。本设计在完成时使用的版本是WebWork2.2.2,目前最新的版本为:W曲Wbd【2.2.4。3.1.1WebWork的主要组成部分1.FilterDispateher(过滤器)在w曲worI(2之前,ServletDispatcher是默认的处理WebHttp请求的调度器。WebWork2以后使用FilterDispatcher作为前端控制器。FilterDispatcher就是一个普通的ServletFilter(过滤器),所有对Action调用的请求都将通过这个FilterDispatcher调度。在web.xml里配置如下:-webwork</fitter-name>com.opensymphony.webwork.dispatcher.FilterDist,atcher</filter-class></filter>webwork</filter-name>/+</url-pattem></filter-mapping>2.ActionContext(Action上下文)ActionContext(eonl.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实这里的容器就是一个Map),它存放的是Action在执行时需要用到的对象,如:在使用WebWork时,我们的上下文存有请求的参数、会话、Servlet上下文、本地化信息等。在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样Action就可在多线程中使用。比较Struts:publicActionForwardexecute(ActionMappingmapping,ActionFormforill,HttpServletRequestrequest,HttpServletResponseresponse 西南交通大学硕士研究生学位论文第14页)throwsException{这里,用户输入的参数被设置到一个ActioIlForrn里面,以及其他的HttpServletRequest和HttpServletResponse,这样做的结果就是这个Action必须符合依赖所有这些接口。而且需要为每个Action都定义一个对应的Form。webwork则优雅的多,提供一个ActionContext,你可以直接从这个ActionContext里面取值。ActionContextac=ActionContcxt.getContext0;这个ActionContext基本上就是一个Map,WebWork的Action代码可以从这个ActionContext里面取值。但有了这个ActionContext还不够,我们希望这个ActionContext里的对象值已经被设置好,并且希望我们的execute需要的参数也被正确的设置,不必每次都去从一个FormBean读取,或者从ActionContext里面去取。当然可以,这是ActionProxyFactory的拿手好戏,ActionProxyFactory的Factory、Proxy和AOP帮我们解决了难题。而executeO方法则简单许多:publicStringexecute()throwsException{⋯⋯)3.表达式语言EL和oGNLEL,全称ExpressLanguage,即表达式语言。它是简单的对象导航语言。由字符串和特殊字符组成。通过EL,我们可以存、取对象数据,而且还可以直接访问类的静态数据、调用静态方法。OGNL是Object.GraphNavigationLanguage的缩写,它是一种功能强大的表达式语言,通过它可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。OGNL在框架中的应用,主要是采用值堆栈(ValueStack)——是一个放置Java对象的堆栈,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。WebWork为每一次请求构建一个ValueStack,并将所有相关的数据对象(例如:Action对象、Model对象等)放到ValueStack中,再将ValueStack暴露给视图页面,这样页面就可以直接访问后台处理生成的数据。4.Interceptor(拦截器)Interceptor是一个非常重要的概念,它将Action共用的行为独立出来,在Action执行前后运行。这也就是AOP,它是分散关注的编程方法,它将通用需求功能从不相关类之中分离出来:同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。开发人员在配置文件中组装Action用到的Interceptor,它会按照指定的顺序,在Action执行前 西南交通大学硕士研究生学位论文第15页后运行。当指定多个Interceptor,则像剥洋葱头一样,按指定顺序~层一层在Action执行之前或之后调用拦截器方法。5.ResultType(返回类型)Reset是Action执行完返回的一个字符串常量,它表示Action执行完成的状态:成功、失败等。它是一个结果页面的定义,用来指示Action执行之后,如何显示执行的结果。ResultType表示如何以及用哪种视图技术展现结果。通过ResultType,w曲Work可以方便的支持多种视图技术(如jsp、Freemarker、Velocit)r等)}而且这些视图技术可以互相切换,Action部分不需傲任何改动。3.1.2WebWork的主要工作流程。眵翱培se喇棚L∞㈣1}w豳w础—^。h6nc棚姆对cI髓nt肇fO噎herfilter81协h如Fk。忙)l。wcbwo出Fdt篁D1∞j此hcrjI豢纛罗e:=:,。l.jL1t吓c“H1lE!”””嗽”一j匀j黪&㈣㈣《m,—-—々t壁拳要。。轰鞠。习《’翔■jht呵c“tot3I燃=嚣;器}d£一上。硎簌IH隆x'wode.,.ma'n}§}^ctdn。女;^“魏}照鏊,挚蝴一’I“?‘》⋯l}Se:t'vlet£l☆H#i鍪j一挚一一一,雕。:嚣4”一。翥《~ww00r一《麴i一。聂赢鼎‘”“一⋯Ihk㈣口5l巳蕊李c”一,l!——.I‰∞酬潮图3-2WebWork—亡作流程此架构图一共分为五部分,其中每部分由不同颜色表示。描述了从客户端的一次请求到最后服务器端响应的整个执行过程。1.浅灰色方框:分别代表了客户端的一次Http请求,和服务器端运算结束之后的一次响应。 西南交通大学硕士研究生学位论文第16页2.橙色方框:表示一次Action请求所要经过的Servlet过滤器。我们可以看到最后一个过滤器就是我们前面介绍的WebWork的前端控制器。3.蓝色方框:这是WebWork框架的核心部分。曲一次请求到达wcbwork的前端控制器,它首先会根据请求的URL解析出对应的action名称,然后去咨询Action.Mapper这个action是否需要被执行。b)如果ActionMapper决定这个action需要被执行,前端控制器就把工作委派给ActionProxy。接着它会咨询WebWork的配置管理器,并读取在xwork.xml文件中定义的配置信息。接下来ActionProxy会创建Actionlnvocation对象。c1AetionInvocation是Xwork原理的实现部分。它会调用这个Action已定义的拦截器(before方法1,Action方法,Result方法。m最后,根据流程的图的方向,它会再执行拦截器(after方法),回到ServletFilter部分,最后结束并传给用户一个结果响应。4.浅蓝色方框:这是拦截器部分。5.黄色方框:这是在开发web应用时,需要自己开发的程序。其中包括;Action类,页面模板,配置文件xwork.xml。3.1.3WebWork与Struts的比较WebWork框架可以为每个Web应用系统提供赖以生存的支撑,为应用系统的开发创建一个可扩展的开发环境。WebWork的主要优点在于:1.WebWork框架实现了经典的MVC设计模式和其他设计模式,这些设计模式让开发人员充分利用已有的组件。2.StrutsTi(第二代Struts)的核心框架,具有非常好的应用前景和广大的用户空间。3.灵活可扩展的架构,所有默认的设置都可以自定义配置,拦截器、过滤器、表现层模板等几乎所有组件都可以实现自定义,能够和其他框架和视图表现实现无缝整合。4.和Dojo及Dwr结合实现Ajax,异步无刷新视图操作。5.自身实现了IoC功能,而且和Spring的IoC能够很好的协作和补充。6.充分利用了OGNL的值堆栈应用,通过值堆栈和表达式语言,使开发人员能更集中精力于业务逻辑。7.和任何其他Model2MVC框架最显著不同的地方是WebWork基于一 西南交通大学硕士研究生学位论文第17页个独立的Command设计模式框架Xwork。XWork框架来源于webworkl,但在Webwork2中,它已经完全和Web应用开发无关,因此可以独立应用到其他场合,基于Xwork所具有的简洁、灵活而功能强大的设计,WebWork才具有了其他MVC所不具备的功能。为了更清楚的了解WebWork,将其与使用最为广泛的Struts进行比较:表3-1Struts与WebWork的比较特性StrutsWebWork2.xAetionStruts要求Action类继承抽象类Action必需实现classescom.opensymphony.xwork.Action接口线程模型Struts的Action必须线程安全WebWork的Act.ion每~个请求使用一个实例对ServletStruts的Actions依赖于ServletsWebWork的Action没有绑定Web或其他任的依赖性何容器Struts需要为每个表单使用FormBO.allS允许直接使用Action的属性FormBeanStruts的FormBeans属性通常都WebWork2使用Ognl进行类型转换,并为基类型转换是字符串本类型提供了转换器对Action执Struts设置~个Action对象,而对可以根据拦截器的功能控制每一个Action的行过程控制执行的顺序几乎无法控制执行顺序3.1.4小结本节通过对WebWork这--目前发展迅速的MVC实现框架进行了简单的介绍,从w曲wjfk体系结构、主要组成部分、主要工作流程、与Struts的比较等4方面对W曲wo出给出了一个全面的整体印象,并针对时下应用最广泛的Struts进行了比较,通过对比Struts的工作流程和应用中的弊端,w曲work部给予了很好的补充。诚然,W曲Work的出现并非为了弥7bStruts,它是一套独立的完整的体系结构,一套优秀的Web开发的框架,让开发者专注于应用的特定功能,简化了开发过程,提高了开发效率。Webwork框架可以和任意类型的表现技术集成,并且在所有的技术中提供行为和语法一致的tag组件。经典MVC模式所带来的好处,WebWork--应俱全,大大提高了代码的重用性和灵活性。在提高软件的性能和可维护性的同时,提高了软件的整体质量水平,为了软件的产业化提供了强大的技术支持。 西南交通大学硕士研究生学位论文第l8页3,2Spring框架3.2.1Spririg体系结构Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理Bean的方式。组成Spring框架的每个模块或组件都可以单独存在,或者与其他一个或多个模块联合实现。图3-3Spring絮构的七层模块其中:●Spring核心模块:Spring框架中最为基础、重要的模块。它提供了IoC容器,即依赖注入。其中BeanFactory是最为重要的概念,是实现IoC的关键。·Spring上下文模块:直接位于Spnng核心模块之上。spdng上下文模块除了继承Spring核心模块的功能外,还添加了用于资源绑定、事件移植、资源装载以及透明地装载上下文等功能。●SpringAOP模块:实现了AOP联盟中定义的AOP编程实现。如方法拦截和切点,以获得逻辑过程中各部分之间实现代码的解耦。·SpringDAO模块:提供JDBC抽象层,使得开发者不用再去编写同RDBMS交互、非业务功能的JDBC代码和分析RDBMS厂商专有的SQL错误代码。而且它能同时提供编程方式和声明式事务控制管理。●SpringORM模块:为当前流行的O/RMapping技术提供集成。比如,Hibernate、iBATIS、JDO等,借助于Spring框架提供的简单事务声明,开发者能够很容易实现对O/RMapping中操作的事务控制。●SpringWeb模块:提供Web应用功能,对应用进行抽象的封装,可以将 西南交通大学硕士研究生学位论文第19页Struts、WebWork、JSF等与Spring整合,形成更佳的解决方案。●SpringwcbMVC模块:提供了MVC的实现,相比较其他流行的MVC框架,SpringWebMVC和Spring容器的结合是完美无缺的。图3.3只是表现了Spring框架的静态结构,从应用流程的角度出发,图34体现了s砸ng框架的动态功能。Spring通过动态代理机制拦截了外界对BeanFactory管理下的对象的调用。其中loc机制用来装载JavaBean,BeanFactory可以管理所有应用的JavaBean,使用者只要将自己的JavaBean通过配置文件告诉BeanFaetory,在应用中BeanFactory会自动加载它们。AOP拦截机制创建了图3-4sprmg框架的动态功能拦截器来拦截对象的调用,它通过横切面为这些JavaBean提供了权限访问、事务锁等通用功能,调用者无需指定被调用者的代理类就可以使用这些对象。AOP拦截机制在调用对象的前后都可以进行拦截,从而形成~个完整的框架实现。3.2.2Spring的核心机制3.2.2.1反转控制(Ioc)/依赖注入反转控制通俗的讲就是由容器控制程序问的关系,而非传统实现中,由程序代码直接操控。控制权由应用代码转到了外部容器,控制权的转移就是“反转”。大i)iljMartinFowler也提出了一个新的名字“依赖注.K(DependencyInjection)¨“,即组件的关系由容器在运行期间决定,容器动态的将某种依赖关系注入到组件之中。依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。依赖注入主要有三种形式:1.Typel接口注入:这是一种很久以前的用法,借助接口来将调用者与实 西南交通大学硕士研究生学位论文第20页现者相分离。PublicClassCalssAfPrivateInterfaceBiB;PublicdolnitalO{Objectobj=Class.forNamc(Config.Blmplernention).uewlnstanee0;iB=(InterfaceB)obj;}'上面的代码中,ClassA依赖于InterfaceB的实现,为了获得InterfaceB实现类的实例,传统的方法是在代码中创建InterfaeeB实现类的实例,并将其赋予iB。而这样一来,ClassA在编译期即依赖于InterfaccB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名(Config.Blmplcmentation),动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。这就是接1:3注入的一个最原始的雏形。而对于一个Typel型IOC容器而言,加载接口实现并创建其实例的工作由容器完成。2.Type2设值注入(Setter):基于Setter的注入:是指那些拥有一个无参数的构造器,在绑定依赖关系时提供Setter方法给loC容器使用的JavaBean。这是Spring推荐使用的注入形式。toC容器通过JavaBean]xlf格的Setter方法,将依赖关系注入到一个组件中,即通过类的Setter方法完成依赖关系的设置:PublicclassDIBySetter{privateAuditDAOdao2null;publicvoidsetAuditDAO(AuditDAOdao){this,dao。dao;}在各种类型的依赖注入模式中,设值注入模式的依赖注入机制更加直观、自然,在实际开发中得到了最广泛的应用。3。Type3构造子注A.(Constructor):通过构造函数完成依赖关系的设定:Publicclass01ByConstructor{privatefinalDataSourcedataSourcc;privatefinalStringname;publicDIByConstructor(DataSourceds,Swingname){ⅡⅡs.dataSource2ds: 西南交通大学硕士研究生学位论文第2l页this.n羽ne=name;}从以上代码可以看出,在Type3类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的依赖关系注入其中。4.几种注入方法的简单比较接口注入模式因为其历史悠久,在很多容器中都已经得到应用。但由于灵活性、易用性上有一定的局限,因而其应用前景不如另外两种模式。设值注入和构造子注入各有其特点,不能一概而论谁优谁劣,Setter方法对于习惯了传统Java.Bean开发的程序员而言,设定依赖关系显得更加直观和自然。而构造子方法在构造期即创建一个完整、合法的对象,所有依赖关系均在构造函数中设定,依赖关系集中呈现,更加易读,在需要时,能规范参数的顺序。可见,构造子和设值模式各有千秋,理论上,以构造子类型为主,辅之以设值类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于SpringFramework开发的应用而言,设值方法使用更加广泛。3.2.2.2Spring中的AOPAOP(AspectOrientedProgramming)即面向方面的编程,也称为面向切面的编程,它提供了从另一角度来考虑程序结构以完善面向对象编程(OOP)。在AOP的应用中可分为动态AOP和静态AOP。静态AOP指的是,切面在编译时应用。动态AOP指的是通过动态代理模式,在目标对象方法调用f;i『后实现应用。在S曲ng中,主要应用动态代理模式,切面在运行期间动态应用,不用重新编译就可以对切面进行改变。高效、灵活的运用两种AOP技术,能够满足几乎所有的应用需求。AOP中几个重要的概念:●切面(Aspect)切面对象操作过程中的截面。用户权限检查是一个应用开发中常见的切面。用户发起请求之后,执行业务逻辑之前。如果我们实现了一个通用的权限检查模块,那么就可以在这层切面上进行统一的集中式权限管理。而业务逻辑组件则无需关心权限方面的问题。也就是说,通过切面,我们可以将系统中各个不同层次上的问题隔离开来,实现统一集约式处理。各切面只需集中于自己领域内的逻辑实现。●连接点(JoinPoint)程序运行过程中的某个阶段点。如某个方法调用,或者某个异常被抛出。连接点定义了一个明确的、可识别的点,一个在 西南交通大学硕士研究生学位论文第22页应用中插入附加逻辑的位置点。●处理逻辑(Advice)在某个连接点所采用的处理逻辑。处理逻辑的调用模式通常有四种:Around:在连接点前后插入预处理过程和后处理过程。Before:仅在连接点之前插入预处理过程。After:仅在连接点之后插入预处理过程。Throw:在连接点抛出异常时进行异常处理。●切点(PointCut)一系列连接点的集合,它指明处理方式(Advice)将在何时被触发。JoinPoints图3—5AOP面向方面编程如上图所示:Advice(处理逻辑)包含了应用到切面的行为,JoinPoints(连接点)是在应用流程上的一系列点,它们是处理逻辑执行的候选目标。Pointcut(切点)决定了处理逻辑执行的位置。Spring中提供的内置AOP支持,是基于动态AOP机制实现。从技术角度来讲,所谓动态AOP,即通过动态代理模式,在目标对象的方法调用前后插入相应的处理代码。SpringAOP的特点:1.Spring中所有的处理逻辑(Advice)都是标准的Java类。这就意味着开发者可以使用任何自己熟悉的IDE开发工具开发s研ngAOP。而且处理逻辑执行点(切点)以xML的形式在Spring的配置文件中指定。2.Spring动态代理模式目标对象实现了一个需要的接口,贝lJSping使用JDK的java.1ang.reflect.Proxy类,该类允许spring动态产出一个实现了所需接口的新类,织入(Weave)处理逻辑,已备处理逻辑使用。3.Spring实现]'AOP联盟接口AOP联盟是一个联合组织,由几个对在Java 西南交通大学硕士研究生学位论文第23页中的实现AOP技术感兴趣团队组成。AOP联盟希望提供一种比EJB技术更清爽、简洁的方案应用到企业应用中。他们的目标是标准化AOP接口,以期在各种AOP实现技术中协同工作。springAOP几乎成为这个事实上的标准。3.2.2.3Bean的生命历程下面通过对一个Bean类的生命周期来考察Spring核心的内部机理,使我们对它有个彻彻底底的了解。一个Be粕Factory可以使用接口org.spdngframework.Beans.factory.BeanFactory表示,这个接口有多个实现,在大多数情况下,Spring框架会实例化BcanFactory。当一个BeanI厂分发已生产的对象时,那些对象已经配置完毕:建立了依赖关系、设定了需要的属性值,等待被调用。而RBeanZ厂也参与至SJBean的生命周期中,提供初始化和销毁方法(如果有的话)。在BeanFactoryl拘实现中,最常用的一个是org.sprin舯ework.Beans.factoty.xml.XmlBeanFactory,它负责装载定义在xML文件中Bean。==黪1篓囊—丁—一—§#%w《《《%《%∞《《∞$∞《%%一一”篓纛黪⋯Post,-一inltJa⋯|}zati—on囊—1—一———r一”ⅫBe黪a咄nNa。meA⋯wafe。罐BeanIsRe●dvToU蚰Containerfg●Shutdown8然劂‘鼍}+—●厂——一“絮蠹需““罐。一Pre-i—nitial⋯Pzation麓——了—一—了———一。C—allcm。ao。m一1l—Inh~taliztn。g⋯Bea—n's,”麓4———∥———一},▲、图3-6BeanFactory中一个Bean的生命周期图3.6展示了一个Bean的生命周期,普通的Java应用,Bean生命周期很简单,使用关键词new便可实例化一个Bean。但s衄g容器内Be锄的生命周期则要复杂 西南交通大学硕士研究生学位论文第24页些,只有理解了Bean的生命历程,才能更好的充分利用Sprmg容器给我们带来的便利。如图3.6,BeanI厂在一个Bean能够被使用之前要进行几步初始化工作,接下来详细介绍每个步骤:1)容器找到了Bean定义,并实例化Bean(该Bean要被使用)。21通过DI,Spring组装了Bean的属性。3)如果Bean实现了BeanNameAware接口,工厂调用setBeanName0方法,传递Bean的ID。如果Bean实现TBeanFactoryAware接口,工厂调用setBeanFactory0方法,传递它本身。4)如果Bean存在一些相关的BeanPostProcessors,则它们的post.ProcessBeforelnitialization0方法将被调用。~个Beanpost-processor是一个实现TBeanPostProcessor的类,当这个类被注珊后,BeanFactory创建的每一个Bean实例,在任何初始化方法被调用之前和之后,post-processor可以对这个Bean做任何操作。5)如果指定了hilt-method,则此时将被调用。afierPropertiesSet与init-method,两者只实现一种。6)最后同5),如果存在BeanPostProccssors,则它们的postProcessAflerlnitialization()方法将被调用。自此,Bean将被使用,且将保留在工厂中,直到它不再被使用。从工厂中移除Bean有两种方式:a)如果Bean实现TDisposableBean接口,则des打oy()方法被调用。b1如果自定义的destroy-method被指定,它将被调用。3.2.3Spring和EJB的比较提及企业级服务的框架时,我们不得不说一下EJ-B,它是一个稳定的、应用广泛的J2EE开发平台。选择某一个开发平台不是排他的,Spring同样能够支持现存的EJB,下面我们从两个方面对二者进行比较:1.Spring与EJB的比较 西南交通大学硕士研究生学位论文第25页特征SpnngEJB事务管理通过PlatformTransaefionManager接口,提供多必须使用JTA事务管理器种事务支持:姻J1IA,Hibernate,JDO等支持跨远程方法调用的事务操作本身小支持分布式事务,可以使用JTA管理器声明事务通过springlg置文件或类元数据声明事务通过部署描述符声明事务支持方法应用事务行为用显示声明或正圃If表达式使用通配符·对每个方法和类声明事务对每个方法和异常类型声明怛1滚(rollback)必须编程实现卸滚行为持久化提供一个集成,包括JDBC、Hibemate、JDO、支持编程实现和声明容器管理的方式iBATIS持久化技术的框架对受管理Bean的持久化操作安全性声Spring本身不提供安全实现支持通过users和roles声明安会性,use嚣明Acegi一个内嵌在s州ng顶层的开源框架,通过和roles的管理和实现由容器指定。Spnng的配置文件或类元数据声明安全性通过在部署描述符中配置安全性声明2.EJB的劣势EJB既然是个标准,为什么开发人员还要寻求Spring呢?原因如下:●编写EJB过于复杂:为了写一个EJB,开发者不得不至少触及4个文件,Business接口、Home接口、Bean实现和部署描述符。类中使用的类和对象及其衍生的对象的查找等,都要加到容器的服务中。相反Spnng使开发者象定义POJO~样定义实现,需要附加服务时通过DI注入和AOP实现。·EJB是高侵入性的:为了使用EJB容器提供的服务,开发者必须使用javax.ejb接口。这就使组件的代码和EJB技术绑定在一起,以致于很难在EJB容器外使用该组件。Spring并不需要实现、继承或使用Spring指定的接口或类,即使脱离Spring环境,组件的重用也是可能的。●实体EJB的不足:实体(Entity)EIB和其他ORM工具相比灵活性和操作特性不够丰富。Spring支持几个不错的ORM工具如Hiben眈和JDO,对应用提供丰富的框架集。对大多数J2EE项目而言,EJB或Spring都能满足要求,如果需要远程事务调用,EJB更能适合需要,Spring虽然可以集成JTA,但似乎有些呆板。如果要寻找一种能够提供声明式事务管理和灵活的持久化引擎,Spring是个不错的选择。3.2.5小结本节主要介绍了Spring框架技术,从Spring的体系结构、核心机制(包括IoC、AOP、生命历程)和Spring与EJB的比较几个方面,对Spring框架进行了全面的、细致的分析。从技术的组成、应用范围和内部的核心机理出发,详 西南交通大学硕士研究生学位论文第26页细的介绍了IoC、AOP的实现机制,其中不乏作者的实践经验总结和一些思考。对Bean的生命历程的介绍,使开发者能够从应用角度对Bean工厂和Bean的使用有深刻的了解,充分利用Spring提供的强大的功能。最后通过对EJB的比较,证明规范并不一定是放之四海而皆准的,有其自身的局限性。Spring的出现使开发者多了一种选择同时能弥补EJB的一些不足或者说更适合某些领域的开发,二者的关系是相互借鉴,在应用上互为补充的。二者的应用范围不同,不能说哪种更好,根据具体的应用需求选择开发平台,F_JB更规范,sping更灵活。3.3O/RMapping技术和Hibernate3.3.1ORM技术对象.关系映射(Object/RelationMapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统m·。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。迫切需要一种技术能够在两者之间无间隙的相互转化,ORM技术就是为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。在Java编程中,访问数据库时我们会使用JDBC或者JDBC—ODBC桥,对于操作数据库可能会写不少数据访问层的代码,用来对数据保存、删除,读取等等。当然我们可以写很多类库,以便于能够重用代码。但是由于不同的数据库所要求的格式、语句各有差别,而且始终是以面向对象的思维去迎合面向关系的数据库,给开发人员造成了沉重的负担。O/RMapping机制应运而生,它将所有我们需要的操作(由对象到关系,以及相反的过程)封装好,形成通用的形式,作为一种中间件存在。开发者需要关心的只是对象,而用O/RMapping机制负责对数据的各种操作。3.3.2HibernateHibernate是一个面向Java环境的对象/关系数掘库映射工具,它的目标是 西南交通大学硕士研究生学位论文第27页成为Java中管理持续性数据问题的一种完整的解决方案。它协调应用与关系数据库的交互,让开发者解放出来专注于业务问题。Hibernate是一种非强迫性的解决方案,可以利用Hibernate提供的数据操作方法,当然也可以使用传统的JDBC来实现数据库的操作。Hibernate在出现之初,就引起了开发人员的极大兴趣,通过不断的完善和发展,Hibernate已经成为轻量级ORM的代言人。3.3.2.1持久层框架持久层,也就是在系统的逻辑层面上,专注于实现数据持久化的一个相对独立的领域。它的主要功能就是如何有效的对持久化数据进行操作。持久层的概念来自于应用软件分层:最初的部署在大型机上,采用单层应用系统;随着Pc和局域网以及数据库的发展,出现了应用程序和数据库的二层结构:应用逻辑和用户代码混杂在一起,使用程序结构不清、维护困难,于是出现了三层结构,将应用层分为表述层和业务逻辑层。同样,业务逻辑层既要负责业务逻辑,又要操作业务数据,为了将数据访问细节和业务逻辑分开,于是将数据访问作为单独的持久化层,而出现了四层结构应用框架。3.3.2.2Hjbernate体系结构Hibernate之所以受到如此的青睐,除了它是一个开源的项目外,它清晰的体系结构和良好的可扩展性都吸引了众多的追随者。它能满足几乎一切持久层所要达到的目标,Hibernate使用属性文件或者XML配置文件来对应不同的数据库方案,并将应用层从底层的JDBC/JTAAPI中抽象出来,完全接管对象的持久化操作。体系结构图如下:兰兰II删IIll∞Illl麓IIlll;111Im竺!竺塑2}Ap—I∞lio“l●■■■■o■■o■■■■■■■■■一。一■o__■■■o_■■■■■■一兰刮|d=到=型]二]图3.7Hibernate体系结构图 西南交通大学硕士研究生学位论文第28页图中各对象简述如下:●SessionFactory(org.hibernate.SessionFactory):是Hibernate编程的起点,针对单个数据库映射关系经过编译后的内存镜像,它也是线程安全的。通过导入配置信息,生成SessionFactory。●Session(org.hibernate.Session):表示应用程序与持久储存层之间交互操作的一个单线程对象,几乎所有业务方法都要通过Session来实现。其隐藏了JDBC连接,也是Transaction的工厂。●持久的对象及其集合:带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。唯一特殊的是他们仅仅与一个Session相关联。●瞬态(transient)以及脱管(detached)的对象及其集合:持久类的没有与Session相关联的实例。可能是在被实例化后,尚未进行持久化的对象,也可能是实例化他们的Session已经被关闭而脱离持久化的对象。●事务Transaction(org.hibernate.Transaction):应用程序用来指定原子操作单元范围的对象,它是单线程的,生存期很短。●ConnectionProvider(org.hibernate.connection.ConnectionProvider):生J戎JDBC连接的工厂。它通过抽象将应用从底层的Datasource或DriverManager隔离开,仅供开发者扩展、实现用。●TransactionFactory(org.hibernate.TransactionFactory):生成Transaction对象实例的工厂,仅供开发者扩展、实现用。3.3.2.3Hibornate实现机制1.对象一关系映射Hibernate从本质上来讲是一种“对象一关系型数据映射”。映射(Mapping)文件是将对象(Object)与关系型数据(Relational)相关联的纽带,在Hibernate中,映射文件通常以“.hbm.xml”作为后缀。以下是映射文件的一个简单例子:(1)(2)</id></hibernate-mapping>实体映射技术作为类与表之间的联系纽带,在ORM实现中起着至关重要的作用。对Hibernate用户而言,映射关系更多的体现在配置文件的中。被映射的类所对应的数据库表必须存在主键字段。类表映射主要包括三部分内容:(1)表名/类名映射name:指定了映射类名为cn.1sdf.ebs.model.OrderFormtable:指定了当前类对应数据库表‘叮ORDERFORM”通过以上配置,Hibernate即可获知类与表的映射关系,即每个OrderForm类对象对应TORDERFORM表中的一条记录。(2)主键映射id节点:定义了实体类的标识,这里也就是对应表主键的类属性name--’'id”:当前跌射类中的属性”idI,对应T_ORDERFORM表中主键字段column=”F_ID”:当Ij{『映射表T-_ORDERFORM的主键为”F—ID”字段length=-”32”:当前字段的长度unsaved—value:”version”:在非显示数据保存时,Hibernate将根据这个值来判断对象是否需要保存主键关联:一对一的主键关联形式,即两张关联表通过主键形成一对一映射关系。如要求一个用户对应一种积分,我们可以在映射文件中通过:Score的主键主键生成器采用foreign,即使用与User相同的主键值。>唯一外键关联:一个外键和一个唯一关键字对应,同样对于上例,采用唯一外键关联则为:●一对多关联一对多关系在系统实现中也很常见。一个用户可能拥有办公室地址、家庭地址等多个地址属性。一对多关系分为单向一对多关系和双向一对多关系。单向一对多关系只需在“一”方进行配置,双向一对多关系需要在关联双方均加以配置。●多对多关联Hibernate关联关系中相对比较特殊的就是多对多关联,多对多关联与一对一关联和一对多关联不同,它需要借助中间表完成多对多映射信息的保存。由于多对多关联的性能不佳(由于引入了中问表,一次读取操作需要反复数次查询),因此在设计中应该避免大量使用或者避免使用。同时,在多对多关系中,应根据情况,采取延迟加载(LazyLoading)机制来避免无谓的性能开销。3.3.2.4Hibernate与EJB/CNP模式比较。在J2EE架构中,CMP(Container-managedPersistence)表示由EJB容器来管理EJB的持久化。二者都具备持久化功能,但在实际应用中的区别主要是:●实体EJB必须遵守J2EE规范,而Hibernate所管理的对象则是POJO。●实体EJB只能运行在EJB容器中,而POJO可运行在任何Java环境中。·对于复杂的域模型,EJB容器提供的对象一关系映射能力有限,而Hibernate则提供了完善的服务。●由于不同厂商生产的CMP引擎差异很大,EJB不一定能顺利从一个容器移植到另一容器,而Hibernate则可无缝集成到任何一个Java系统中。●Hibernate是开源的,允许开发人员通过查阅详细的参考文档,根据需要改写源代码,定制客户化功能。4三种技术整合的优越性以上对WebWork、Spring和Hibernate三种框架技术,进行了详细的讨论 西南交通大学硕士研究生学位论文第3l页和比较,从中可以看出,对于各个框架技术就个体而言不存在优与劣,而只是应用领域不同而己。而和其他技术整合使用时,所表现出来的差异则大不相同。如何针对某一具体领域,选择合适的框架技术来相互弥补应用中的不足,则是很值得讨论的。WebWork是一种优秀的J2EEMVC实现框架,运用了成熟的MVC设计模式和前端控制器(FrontController)模式,并基于尽可能保持事物简单化的动机。WebWork采取了分级的拉出式MVC模式。“拉出式”是指视图组件根据要求,从控制器中将模型信息拉出来作为响应。这与传统的Model2的方式不同,传统的Model2没有使用模型来管理信息,而是直接使用视图来访问信息。“分级”是指对视图数据的存放,在WebWork中,“值堆栈”用来为视图提供信息,利用FilterDispatcher配合xwork.xml文件实现对整个系统的导航。对业务流程动态配置,而不用将流程控制硬编码在代码中。WebWork利用强大的OGNL和值堆栈机制,为View层和Model之间实现了完美的数据共享,方便、灵活的拦截器是开发人员可以针对特定需求实现数据的拦截。WebWork是一个非常有前景的框架技术,虽然很快就不会出现WebWork的更高版本,但即将出现的StrutsTi是一个Struts和WebWork的结合产物,它的实现技术则沿用了WebWork的工作机制。我们有理由相信,未来一个以WebWork核心技术为基础,以Struts广泛用户群为依托的新型MVC实现框架将会一统J2EEWeb开发领域。Spring是业界一直非常推崇的轻量级容器,与各种框架能够很好的集成。虽然WebWork本身通过XWork实现loC机制,但考虑到在应用中会使用到AOP机制,而选择使用sp血g作为容器来维护Bean的操作,能够很好的实现业务逻辑的分离,避免将所有的任务都由WebWork完成。依靠IoC的依赖注入,给开发人员减轻了负担,使程序代码逻辑结构清晰,这样不但实现了组件问的松散耦合还大大加快了开发进度。Spring框架的优势不止于此,如事务操作、AOP和集成的持久层实现等给开发人员带来极大的方便。不用拘泥于设计事务机制、繁琐的try-catch代码和数据库连接的获取、关闭等。Hibernate作为一种持久层框架和Spring天然的搭配在一起,使开发人员使用面向对象的操作方式操作数据库记录。更为重要的是,应用系统在不同数据库间移植非常方便,只需在配置文件中更改即可。开发过程中,三种框架技术的集成非常方便,作为开源框架中的佼佼者,三种技术顾及到了和其他框架的结合,而且开发者针对具体的应用需求,可以修改源代码,定制客户化服务。在项目实施中通过对以上三种框架的集成,充分利用各自的优势,互为补充,取得了良好的效果。 西南交通大学硕士研究生学位论文第32页第4章基于WSH技术的WEB架构设计4.1架构设计的目标软件系统的架构是一个宏大的话题,所谓架构设计就是需要将系统划分为具有相互关联的若干组成部分,如何使各个部分有机的组织起来、相互作用,以及对系统中逻辑、物理、系统等关联作出明确定义。良好的架构设计,可以对人力、物力等资源进行合理配置、明确分工,使各个团队互相紧密协作,从更高的角度看待整个系统。由于架构设计是在动态中完成的,因此在把握架构设计的目标上尤其重要。架构设计的目标是设计出一个动态的可伸缩的系统,这样的系统能够伴随着系统功能需求的不断变化动态而方便地扩展,能够保证系统运行的稳定和可靠性。一个好的架构设计是有一定的准则可遵循的,在系统设计过程中,要不断牢记这个目标,可以概括为以下几点:1.合理性:系统在设计之初,要根据应用的具体需求确定架构,不要一味以最流行的设计框架为首选,而应该在充分需求的基础上,确定最合理的架构原则。2.重用性:象组装汽车一样组装程序是软件工业化的目标。重用包括组件和设计模式重用等方面,设计可重复使用的组件是软件发展的基石。3.简洁性:在设计架构时,各层次、模块间的交互尽量简洁,将复杂的操作封装在模块内部,呈现给用户的只是接口或者抽象类方法。4.可扩展性和可移植性:在架构设计之初要从更高角度预留必要的扩展接口,包括功能的扩展和系统的扩展。可移植性则是扩展的特例,在设计之初要考虑到不同的应用环境和潜在客户端,为未来的扩展留下铺垫。5.性能:作为设计系统时的首要考虑因素,在架构的设计中,选择合理、成熟的框架技术,组织形式,可以大大提高系统性能。从另一个角度而言,要针对具体应用:如对实时性要求强、未来用户巨大或可操作数据多、复杂等等,根据不同的重点,选择不同的设计算法。6.安全性:安全性是任何系统的关键,在设计架构过程的每一步都要考虑到安全性,而不仅仅到实现时再引入安全机制。架构设计的目标不仅仅是以上的6点,更多的考虑要靠设计人员的经验和 西南交通大学硕士研究生学位论文第33页领域专家的意见。但架构设计是十分重要的,是系统的开发的骨架,通过架构设计将整个系统的脉络梳理清楚,从宏观上把握整个系统的计划、进度、关系、流程等。4.2集成WebWork,Spring,Hibernate的架构设计遵循架构设计目标的要求,结合WebWork、Spring和Hibernate的相关技术特点,完成J2EE架构的具体设计。参考J2EE框架结构,应用中采用三层结构:Web表示层、业务逻辑层、持久层。各个层次之间具有不同的功能,并保持清晰的隔离,以使彼此独立存在。但各层之间采用接口进行通信,屏蔽了内部的实现细节。其实现为Web表示层采用WebWork框架,业务逻辑层采用Spring框架,而持久层采用I-Iibemate来实现,其协作关系图如下:WebWork-MVCAorionActionSupporlInterceptolValidationFreemarkcrJspfSpringlTranscationsFilterDispatchoIAcegiSecurity●—————————_.一HibernateSessionManagementlBusinessServicelClassesXwork.xmlHibemateDataSourceSessionFactoryConnectionP001QueryLanguageOtherHibernateSupportServices图4-1WebWork,Spring,Hibemate协作关系图如上图所示,我们将应用框架按其逻辑划分为三层结构,其中有一点要说明的是:在这三层中都涉及了一个模型层,它涵盖这三层之中,我们称之为领域模型层。领域模型层包含的是表达实际业务对象的对象,其作用是在不同的层间移动,避免使开发者再构建和维护专门用于数据传输的对象DTO来匹配领域对象。它使开发者能使用很自然的方式处理对象,不用编写额外的代码,而且当海量操作时,减少了内存空间使用并加快了处理效率。●Web表示层:应用中Web表示层显示模型数据,并负责和提供用户界面同用户交互。使用WebWork作为表示层框架:管理用户的请求和响应,并通过FilterDispatcher控制器委托业务逻辑层来处理,根据处理结果提取需要的模型数据,选择合适的视图表现,转移到用户设定的页面。这其中还要进行必 西南交通大学硕士研究生学位论文第34页要的拦截和UI验证。●业务逻辑层:典型的Web应用的中间组件一般是业务层或服务层。使用Sphng作为业务层框架,通过读取配置文件,Spring容器自动生成Bean实例,供业务逻辑使用;管理事务操作;提供了与表现层交互的接口;管理业务级对象之间的依赖性;隔离了表示层与持久层;调用持久层接口方法,向供表示层使用的模型层填充数据。●持久层:持久层是Web应用中直接与数据库打交道韵逻辑单元,实现了O/R映射,将面向对象的操作转化为面向关系的操作。使用Hibernate作为持久层架构能完全屏蔽具体的数据库实现;通过Hibernate提供的API和HQL查询接口使操作数据更有效、便捷;向下屏蔽了不同数据库的差异;向上为业务逻辑层提供需要的访问接口。4.3WebWork和Spring框架的整合WebWork与spring的结合几乎是完美的。不可否认,二者之间有功能的重叠,如二者都具备IoC功能,但协调二者的关系很简单:WebWork框架提供了一个基于接口的loC容器,同时提供了和第三方loC容器的集成。在应用项目中,我们直接使用Spring框架作为IoC容器。4.3.1WebWork与Spring的结合在讨论二者结合之前,我们先讨论一个有趣的问题,WebWork的Action类是否需要由Spring管理?否:这样Action类还是象以前那样在xwork文件中定义,我们可以通过标签定义Action所依赖的Bean组件,或者根据Bean的名字自动注入。是:Action类本身也是Spring来管理。在xwork定义文件中的Actionclass对应Bean的引用,具体的类在Spring的Bean配置文件中定义。这样可以更好的使用Sping为我们提供的功能,如:spring的AOP,基于Acegi的权限控制等等。在web.xml文件定义和开启Spring的监听器,代码如下:org.springfi'amcwork.web.context.ContextLoaderListener</lkstener-class></listener>在webwork.properties中设置WebWork对Spring的支持: 西南交通大学硕士研究生学位论文第35页webworLobjectFactory。sprmg这样在Action中声明需要某SprmgBean,就会自动注入进来。spring配置片断如下:/foo.jsp</result></action>以上代码表明:action使用的是一个Bean的ID,容器委托Spring来生成所需要的类实例。这里有一点要注意:WebWork的Action是线程安全的,即WebWorkAction是prototype的,对于每一个Request,WebWork都会创建一个新的Action实例来处理,WebWork通过flew获得Action的实例引用。而Spring创建的Action完全是通过Java反射API调用,其默认的Bean创建方式是采用单例模式sin甜咖n——即创建一个Bean对象,然后服务于所有的请求。要在两者之间达成一致,最好将singleton=”false”。考虑到以上原因,对于prototype类型的Bean来说,Spring创建Bean和调用Bean的效率是很低的。在实际应用中,我们在xwork.xml中直接为每一个action指定类,当容器检测到class后,直接生成该类的实例,而在业务类逻辑层中则使用Spring的loC注入所需要的持久层类对象。/WEB-INF/pages/ticketlndexlnput.jsp</result></action>其中的方法参数指定了执行该TicketIndexAction的edit方法,如果没有method属性则默认执行execute方法。4.3.2WebWork与Spring的分工1.WebWork的工作,总得来说是提供一个流程的控制:●通过UItag接收用户请求,将基于htIp的请求参数和相关的环境变量封装到通用的ActionContext中。●Xwork接收到WebWork传递过来的ActionContext,放入ValueStack。●执行拦截器before()方法,执行action的execute()方法,执行拦截器aflerO方法 西南交通大学硕士研究生学位论文第36页●委托给Spring执行,并返回Result,根据设置显示结果给客户端。2.Spring的工作,主要是解决对象之间的依赖问题·创建action对象,为其装配相关的类成员变量,比如Dao类,事务控制。●组织相关业务逻辑,本身或者再委托给下一级处理,并返回合适的结果给调用者。4.3.3WebWork与Spring的在J2EE中的位置WebWorkjSpring图4-2WebWork,Spring在J2EE框架串的位置如图牛2所示,WebWork处于J2EE框架的Web表示层中,而Sprmg处于业务逻辑层中,其工作过程如下:1)将w曲页面中的输入元素封装为一个(请求)数据对象。2)根据请求的不同,(FilterDispatcher)调度相应的Action进行处理,并将(请求)数据对象作为参数传入。31Action单元委托业务逻辑层处理单元处理后,返回一个结果数据对象。4)调度单元根据返回结果,将结果数据对象中的数据与预先设计的表现层相融合并展现给用户。4.4Spring和Hibernate的框架整合Spring作为轻量级容器受到广泛关注,它可以很容易的与现有的其他优秀框架集成使用。Hibernate作为O/R技术的实现者,同样受到广泛的好评,将二者有机的结合,可以在应用中将两种框架的优势发挥的淋漓尽致。 西南交通大学硕士研究生学位论文第37页4.4.1Spring与Hibernate的结合Sp血g和Hib锄ate的结合几乎是必然的,spfing和HiberI哦e都有各自的配置初始.化文件,将二者结合时可以使用一个配置文件来完成两个框架初始化任务:q细≯.cn/lsdf/ebs/modeI/OrderForm.hbm.xml</value>⋯⋯//其他映射文件</list></property></props></property>吲Bean>⋯⋯//其他Bean定义</Beans>S砸ng框架集成了对Hibemate的封装操作,可以充分利用S砸ng提供的HibernateTemplate,模板实现了所有需要的方法,且使用非常简单,下面我们就模板的实现机制介绍如下:在应用Hibernate框架时,如果我们独立使用Hibernate的Session接口来操作对象完成持久化操作:对一个对象实现Save操作:Sessionsession=factory.openSessionO;.Tmrtsactionix;try{戗=scssion.bcginTransaction();//9:[:始一个事务sessiomsavc(orderForm);//保存已创建并填充必要数据的OrderForm类对象。仅.commitog/提交事务}catch(Exceptione){if(tx!=nullltx.rollb∽kO;//如果出现异常,就撤销事务throwe: 西南交通大学硕士研究生学位论文第38页}finallyfs鹤siondo&e();/,不管成功与否,都要关闭Sessiou}以上可以看出,对于执行一个save方法,就要进行大量的包括事务、异常捕捉等操作,而HibernateTemplate方法,将所有的操作都封装起来,只要继承了HibenlateDaoSllpport类,再调用getHibemateTemplateO.save(orderForm);就可以完成对于数据对象的save操作。下面我们从源代码的中看看S埘ng是如何实现的:publicSerializablesave(finalObject∞n哆)throwsDataAeeessExeqaion{r哦Brn(Se缸alizable)e)oecute(newHibemamCallbackO{publicObjectdolnHibernate(Sessionsession)throwsHibernateException{//检查给定的Session2=是否可以进行写操作cheekWriteOperationAllowcd(session);retllrnsession.save(entity);}},true);}通过深入研究HibemateTemplate类的源代码,在execute方法中,语句:booleanexistingTransaction=SessionFactoryUtils.isSessionTransactional(session,getSessionFactoryO):判断是否给定的Session是可事务化的?若是,通过Spring的transaetionI具将其绑定到当前线程。该方法中使用SessionHolder类,它封装了一个HibernateSession和一个HibernateTransaction。将所有的session实例都放入了Collections.synchronizcdMapOqj,synehronizedMap返回由指定映射支持的同步映射,其后对session的操作都是事务性的。通过使用S研ng的模板方法,我仃J.-I以大大减少对于获得连接、事务等的重复操作,将主要关注点放在业务逻辑上,而且使程序代码结构清晰、简洁。4.4.2Spring与Hibernate的分工Spring处于业务逻辑层之上,顾名思义它主要负责业务逻辑流程,形象的说就是~个管理者,它负责整个工序的步骤和进度,根据不同的时机和返回的结果,决定下一步的动作。而真正工作的则是Hibernate,它处理持久层数据,更像一个工作者,根据管理者的要求去执行具体的任务,在这里是去执行对数 西南交通大学硕士研究生学位论文第39页据库的操作,将返回的结果报告给管理者。当Web层的Action委托业务逻辑层处理单元进行业务处理时,处理的任务可能很复杂,业务逻辑层在把握流程的同时,将具体的和数据库打交道的实现委托给Hibernate的持久层来处理,通过调用Spring自带的HibemateTemplate方法(要说明一点就是,模板方法只是对Hibernate的操作的封装,并不能替代Hibernate),将对数据的处理结果返回给业务逻辑单元。4.4.3Spring与Hibernate在J2EE中的位置图4-3Spring.Hibernate在J2EE框架中的位置如图禾3所示,Hibernate处于持久层中,直接和数据库进行交互。其过程是,业务逻辑层管理业务逻辑的执行过程,具体和数据库数据交互的操作通过委托给持久层的DAO类来完成,根据返回结果执行下一步逻辑,进而再返回给Web表示层,完成客户端的一次请求操作。4.5WebWork,Spring和Hibernate集成框架工作流程以上我们分别讨论了WebWork和S研ng以及Sp咖g和Hibernate的整合技术实现,下面我们以一个应用请求的整个过程来从三者的角度讨论框架技术的工作流程: 西南交通大学硕士研究生学位论文第40页图4-4WebWork,Spring,Hibemate集成框架工作流程图从图4.4中,我们可以看到一个用户订单的保存过程,图中不同的颜色代表了不同框架的功能,根据序号,可以清楚整个请求的过程:当用户在浏览器中输入所订购的信息后,一张订单在经过客户端验证后,提交给Controller控制器,控制器根据预先在配置文件中设定的位置,调用OrderFormAction的save方法。OrderFormAction又.委托OrdcrFormManager来完成所需要的保存方法,Web层的工作结束。OrderFormManager进行服务器端验证,并调用OrderFormDAO的save方法,将保存到数据库的操作委托给持久层(也就是DAO层)完成,业务逻辑层工作结束。OderFormDAO是一个辛勤的工作者,它负责将订单数据保存到数据库中(这里可以使用Spring提供的HibemateTemplate来完成),持久层工作结束。我们可以立即返回刚刚保存到数据库中的那个对象(或者说那一条记录),也可以返回一个布尔值,以确定是否保存成功。我们这里返回了保存到数据库中的那个对象,一层层依次回到客户端将其内容显示给客户。下面用时序图来演示整个框架的工作流程: 西南交通大学硕士研究生学位论文第41页?II薯且.1,,7lI㈡-0-粉;江卜瞪⋯j㈦图4.5WebWork,Spring,Hibernate集成框架工作时序图从图中我们可以看出,用户的一次请求到达webwo出的前端控制器,它首先会根据请求的URL解析出对应的action名称,接着前端控制器就把工作委派给ActionProxy,AcfionProxy会咨询WebWork的配置管理器,读取xwork.xml文件中定义的配置信息。接下来AetionProxy会创建ActionLnvocation对象,流程开始了。Actionlnvocation依次执行拦截器的before方法,进而执行***Action,如上图所示。当返回结果(Result)后,还要执行拦截器的after方法(时序图中没有给出),再回到ServletFilterDispatcher,组装数据并根据视图表现技术,将结果View页面呈现给用户。 西南交通大学硕士研究生学位论文第42页第5章乐山大佛电子商务平台分析与设计随着Internet的普及和发展,基于网络的信息管理和服务已经深入千家万户,网络给人们的生活带来了革命性的变化。越来越多的人意识到Internet所蕴含的巨大经济价值和无限商机,基于Web的管理应用也得到了蓬勃发展。如何能充分利用这一广阔的平台,让它为广大的受众所接受和服务,作为国家级风景区的示范管理机构一四川省乐山大佛风景名胜管理局,结合信息时代的特点和优势,依托先进的互联网络技术搭建乐山大佛电子商务系统,整合其拥有的旅游资源,以提升服务和管理,拓宽现有业务,充分发挥“乐山大佛”品牌优势,最终实现将乐山大佛建设成国际旅游精品、国际旅游示范区的宏伟目标。5.1需求分析需求分析是指理解用户需求,就软件功能与客户达成一致,估计软件风险和评估项目代价,最终形成开发计划的一个复杂过程。需求分析是软件开发中最重要的一个环节,因为它具有决策性、方向性、策略性的作用,在软件开发的过程中具有举足轻重的地位。在一个大型软件系统的开发中,需求分析的作用要远远大于程序设计。从客户的角度说,需求分析就是要充分了解客户的需要包括客户的现有条件,将客户的需要转化为程序设计的功能模块。从软件设计的角度说就是通过需求分析能把软件功能和性能的总体概念描述为具体的软件需求规格说明,从而奠定软件开发的基础。5.1.1行业现状分析就四川省乐山大佛风景区而言,从游客分布上来看,绝大部分都集中在旺季,特别是五一、国庆两个旅游黄金周,这样造成旺季景区压力过大,容易超出生态系统的承受能力和管理能力,游客享受的服务也难免差强人意。从旅客组团的来源上看,超过90%的旅游团队是由成都的旅行社发出的,这样开发管理很被动,管理局只能坐等业务上门,无法主动地宏观调控客源。同时业务开展也有局限性,没能更好地拓展省外、国外游客。从管理服务上来看,面对突发事件和旅客激增不能很好的把握,很难统筹兼顾,服务质量无法控制和提高,游客安全无法得到切实的保障,给拓展游客 西南交通大学硕士研究生学位论文第43页带来一定的困难。5.1.2系统总体需求乐山大佛电子商务平台,是在已有门户网站的基础上开发的,针对以上行业现状和日常工作中的业务流程,系统提供了网上订购管理:通过Into'net实现了网上订票、订购旅游纪念品、酒店预定、机票预定等。在对用户订购的信息进行详细分析的基础上(包括订购时间、团队类型、订购票数等),从宏观角度统筹分析客户来源和客户流量,做到有的放矢,提前做好相应工作。从历史数据中挖掘季节性、周期性旅游趋势,预测旅游客户群分布,为管理局工作和制定计划提供决策和导向性建议。本系统主要适用于两类用户:客户和管理人员。将其功能分解为两部分客户功能区和管理功能区。下面从这两方面对系统作一整体分析:l-客户功能区:在通过和用户充分、反复交流的基础上,制定了详细的需求分析书,根据产品规格说明(MarketingRequirementDocument,简称MRD),我们提炼出系统主要功能并使用用例图来描述系统的静态情况。用例是外部可见的一个系统功能单元,这些功能由系统单元所提供,并通过一系列系统单元与一个或多个参与者之问交换的消息所表达。用例的用途是在不揭示系统内部构造的情况下定义连贯的行为,一个用例代表系统的一部分行为,是对一组动作序列的描述。而用例图是对系统,子系统或类的行为进行建模而显示用例、参与者以及它们之间的关系。客户功能区用例图如下;图5-1客户功能Ⅸ用例分析客户功能区主要提供客户订购票务的功能,包括订购管理、取消预定、退 西南交通大学硕士研究生学位论文第44页订管理和领票入信息管理等。通过用例分析,我们了解了用户和系统的交互过程和接口,以及所要提供的服务项目,将系统的详细功能模块划分如下:图5-2客户功能区功能模块图从客户区功能看,尽量简化客户的操作,主要包括个人信息、订购管理等六个功能模块,下面就具体模块功能说明如下:·订购管理:是整个系统的核心,用户通过注册为合法用户,登录后即可开始订购操作,可供选择的订购种类为五种:景区票务、酒店预定、纪念品预定、航班预定和火车票预定。就景区票务而言,提供了门票全票、60岁以上老年人门票,学生门票、现役军人门票、残疾人门票、儿童免票、革命伤残军人门票免票、离休干部门票免票共8种。用户可以任意选择一种或者几种门票并确定所选门票的时间和订购数量,确认完成后,输入或选择已注册领票人、客源地等信息,从而生成订单,最后可以选择立即支付和延后支付等。客户订票流程如下: 西南交通大学硕士研究生学位论文第45页图5-3客户订票流程图·领票人管理:主要对领票人进行管理,实行网上订购的用户,必须选择或输入领票人信息,一张订单对应一个领票人。用户网上预定支付后,领票人持有效证件到服务台领取所订产品,如果领票人不能本人到场,可委托代理人领取。领票人管理包括注册、修改、删除等。●取消预定:当用户订购产品后,生成订单,但未进行网上支付,该订单处于未支付状态,用户可以对该订单进行取消操作。如果用户迟迟不对此订单进行网上支付,也未及时取消该订单,则订购日期小于当前日期时,此订单自动作废。·个人信息:主要是对用户本人的注册信息进行编辑和修改。当用户注册后,即可享受一个最初的积分值,每一次用户通过此用户名订购商品时,根据该商品预设的积分,累加到客户的积分上,当客户积分累加到一定程度,便自动享受不同等级的折扣和其他优惠政策。●退订管理:主要针对用户由于个人原因,在进行了网上支付后,不想订购此订单产品,而欲退回支付款项。退订管理要比取消订单复杂,因为已完成银行支付功能,故要求用户填写退单理由,并等待管理员批 西南交通大学硕士研究生学位论文第46页复。在用户注册时用户信息中包括退票银行名称、退票银行账户名、退票银行帐号,这三项银行帐户信息是为了方便用户有订单退订请求时,财务人员及时将退款转到该用户的帐户中。下面是退票管理流程:图5-4退订流程图在办理退单过程中,要依次经过管理员的批示,即是否允许进行退订此笔订单。到达财务人员,财务人员根据用户注册时提供的退订帐号将该订单款项在扣除手续费后,返回给用户。同时通知管理人员退还成功。管理人员填写退单答复后显示给用户相应信息。●订购查询:可根据订单状态(未支付、已支付、己取消)和订单日期进行查询。客户功能区订购管理的其他模块与景区票务相似。2.管理功能区:管理功能区主要提供管理人员操作项目,管理人员主要包括:系统管理员、产品管理员、操作管理员、财务管理员等。管理功能区用例图如下:●超级管理员:系统管理员也可以称为超级管理员,主要完成系统平台的配置信息、对系统注册用户和所有管理员信息进行管理,包括授予不同的角色,在必要时查询审计日志等。图5-5管理功能区用例图●产品管理员:产品管理员主要负责对产品信息进行维护:如票务信息、 西南交通大学硕士研究生学位论文第47页优惠管理(赠票管理、折扣券管理、礼券管理)等。图5-6产品管理员用例图●操作管理员:操作管理员主要负责订单管理、退订管理、捐赠系统和查询统计信息,同时还要负责管理注册用户优惠信息。图5.7操作管理员用例图·财务管理员:财务管理员主要负责退订管理中财务清退和结算管理等。(9仝么箩!“@射鑫矿—<要!)图5—8财务管理员用例图通过对系统用例图分析,管理功能区主要是管理人员对订购产品、订单信息等的维护工作。在充分考虑操作人员便捷以及功能需求的基础上,将系统各模块划分如下: 西南交通大学硕士研究生学位论文第48页乐山大佛电子商务系-统tLSDF管理员区订篮管理重Il蓁ll篓|j茎lj茎|1霎lI耋lI雾雏萋i『錾ll耋Il量{|耋{I蓁l{蓁雏图5-9管理功能区模块图图5-9中将管理员区按其功能划分为订单管理、产品管理等九个模块,详细模块功能说明如下:●订单管理:订单管理是整个商务平台的核心,故我们将其单独作为一个模块,主要负责订单的搜索和统计,按照详细条目分析和统计,使管理人员能更清楚的了解不同时间段、不同状态、不同来源的订单的详细信息。对于订单的统计包括历史数掘统计和具体时间段统计等。●产品管理:主要负责对产品的管理,这里的产品泛指各种票务和其他的订购业务项,包括对产品的添加、删除和查询操作。在新建某种产品时,如票务,要设置该票种的起始有效时间和终止有效时间,同时设置此种产品的积分值,以便于针对订购该产品的用户的积分进行累加。●捐赠管理:主要负责游客募捐或者一些特殊客户处于信仰目的而捐赠的物品、钱财等。·优惠管理:主要负责对于注册用户的各项优惠政策的管理和实施。这一功能体现了订购系统的激励机制,主要包括赠票管理、折扣管理、礼券管理三部分。对于经常在网上订购票务的用户,享受积分累加,当积分累加到一定程度,便可享受相应的优惠政策。优惠包括赠票:如团体购票和淡季购票;折扣券:对于VP等级用户或积分达到一定程度的用户享受相应的金卡折扣、银卡折扣等,随着积分的累计,达到相应等级便可享受相应服务,可以由银卡升级为金卡;礼券:适用于友好合作单位和景区相关部门庆典活动等。●结算中心:主要负责对订购的各种项目的金额和折扣进行统计,同时对 西南交通大学硕士研究生学位论文第49页消费趋势进行简单预测,为财务人员和决策人员提供数据支持。●用户管理:主要负责注册用户的管理和具体用户的优惠管理,可以对注册用户实施暂停、禁用等操作。添加和维护用户的优惠项目,可以暂停、禁用某一优惠项目。●退订管理:主要负责对已支付的订购产品的退订处理,如图50所示,操作管理员负责审批、财务管理员负责执行退款业务,操作管理员再将回复一并处理后,完成退订操作。同时对于操作管理员,系统在其登录时提供提醒,如果存在未处理的退单业务,将提示管理员及时处理。●系统管理:主要负责注册管理人员信息维护,同时由超级管理员负责创建和对各管理人员赋予或禁用相应权限、角色等。●查询统计:主要实现了对各种订购产品的查询和统计工作,供各类操作人员方便本身工作,可以按照不同条件任意组合查询。超级管理员或者具备查看权限的管理人员,在出现特殊情况时,可以查询审计日志,其中详细记录对各种数据的操作。最后当用户领取订购产品时,读取数据库中已支付但未领取的订单信息,打印该订单并将订单所订购产品交予用户。设计时采用一个独立的客户端程序,安装在操作员的客户机上,根据订单上所订购的产品,打印时采用套打,并同步到数据库中。5.2系统设计通过对乐山大佛电子商务系统进行详尽的需求分析,我们提炼出了系统的结构模型以及各模型之间的关系。本节主要根据需求分析,细化对象用例问的关系,抽象出基本的类层次模型和类关系模型,并根据选定的集成框架(WcbWork+Spring+Hibernate)将需求分析中的结构模型转化为系统设计的框架结构。架构设计决定了系统各个主要组成部分之阃的关系,如何将需求分析中的需要在系统设计中合理的满足,是整个系统的基石。利用架构中各个层次之间的关系对实例系统进行详细分析,力求设计一个满足应用需求的、结构规范、关系明确、功能清晰、良好扩展的应用系统。5.2.1对象关系设计对象关系设计又可以称为域模型设计,它是对各个模块抽象的对象实体进 西南交通大学硕士研究生学位论文第50页行封装。实体对象与数据库表的记录相对应。它是整个架构的最小单元,在设计中它浮动于整个架构之上。在完备的J2EE设计中,每一层次都可以有自己的模型对象,从而使各个层次间完全隔离开来,在需要时通过传递的参数组装成模型对象。而在本系统的设计中,为减少系统问冗余和内存开销,提高系统性能,采用单一模型对象,在需要时整个模型对象作为参数在各层次间传递。系统的类结构图如下:图5.10LSDF类结构图以上是整个类关系结构简图,其中省略了部分属性显示。类描述了一系列拥有信息和相互通信的实现行为的离散对象。通过静态视图(类图),直观的体现了类对象之问的协作关系。5.2.2系统流程设计以上介绍的域模型,它的设计直接体现在持久层。我们首先就就整个架构的流程进行分析设计,依据WSH集成框架,项目各个模块都遵循了架构分层的 西南交通大学硕士研究生学位论文第51页设计原则:从Web表示层到业务逻辑层,再到持久层的从上到下的操作模式。}‘!。竺爿二三三三至耳一一臣苎苎苎虽}粤塑《匦璺一一巴圈:竺《兰雪一一臣!驾图5-11LSDF系统流程图系统流程图描述了各层之间的调用关系,下层屏蔽了具体的实现细节,向上层提供所需要的服务,通过接口来实现,一个Action可以根据需要调用多个Manager,同样一个Managerlmpl为了完成业务逻辑调用一个或多个DAO来实现。图5-11除了表示操作业务流程规范外,还给出了各个层相应的命名规范。5.2.3持久层设计在详细设计过程中,持久层设计主要充分利用Hibernate提供的O/R映射功能,在程序中通过具体类与数据库进行交互。遵循系统架构图,持久层通过DAO接口向上层提供所需要的服务,而DAOHibemate类实现了对应的DAO接口中的操作,通过对应模块的域对象(DomainObject),完成数据库的CRUD操作。在实际应用中,我们使用Spring框架中集成的HibemateTemplate模板类,来完成针对数据库的各种操作,并要求实现类继承org.springframework.OITO.hibernate3.support.HibemateDaoSupport类。由于整个项目所设计的持久层类很多,不能将整个类图完全显示,故只选择OrderForm(订单)类为例,其他持久化类与此相似。晕鲁 西南交通大学硕士研究生学位论文第52页一避塾?蓥乏]$__d腻龃似|t■船■■咄)棚l}一:二==:{蠹爱瑟甄曩一一j警型图5.12LSDF持久层类关系图如图5.12所示,其中BaseDAOHibemate类继承了HibernateDaoSupport类,OrderFormDA0接口的几个方法是暴露给上层也就是业务逻辑层的方法,而OrderFormDAOHibernate类实现了对应的方法,从中我们可以看出,通过使用OderForm类,实现了对订单的新建、获取、更新、删除操作。持久层的设计基于Hibernate框架工具,使我们脱离了操作数据的具体细节,将重心放在关注对象之间的关联上。通过配置文件,不但可以完成从对象到数据库记录的映射,更重要的是可以忽略具体的数据库版本,在多种数据库之间方便的移植。在实际应用中,在开发时使用Mysql作为生产数据库,而发布时则方便的转换到功能更完备的其他数据库,如Oracle等。5.2.4业务逻辑层设计业务逻辑层在详细设计时,主要针对业务流程进行细致规划,对于某些实现出于效率和性能的考虑设计合适算法,并精确表达这些算法。遵循系统架构图,在业务逻辑层各个模块定义统一Manager接口向表示层提供服务,而Managerlmpl类实现了Manager接口方法,具体实现方法的细节,根据需要调用相关的DAO接口,实现对数据的访问操作。在实际应用中,我们使用Spring框架,通过IoC(依赖注入)方式,将需要的DAO对象在运行时动态的注入到对应的Managerlmpl类中,供调用方法使用。同时使用Spring框架提供的事务处理机制,对于某些操作如save“·方法,实现方法级的事务处理,以上都可以方便的在配置文件中指定。同样由于项目中的涉及的业务层设计类很多,故选择OrderForm(订单)的业务逻辑类为例,其他模块与此类似。 西南交通大学硕士研究生学位论文第53页图5.13LSDF业务逻辑层类关系图如图5.13所示,OrderFormManager接13向W曲表示层提供需要的服务,而OrderFormManagerlmpl贝lJ具体实现了这些服务,在具体实现方法中会用到持久层类对象完成业务逻辑。从类图中可以看到其中有setProductDAO和setOrderFormDAO方法,这两个方法就是通过Spring配置文件完成的依赖注入功能,使用设值注/X.(Setter)的注入方式。Spring作为一种轻量级的容器,负责管理和维护类对象,我们在实现中使用了它的依赖注入和事务处理功能。通过在配置文件中指定类之间的依赖关系,在运行时动态注入所需要的对象实例,实现了业务逻辑层和持久层对象之『日】的关联。5.2.5表现层设计表现层在详细设计时主要负责与用户的交互,处理用户的请求和将处理结果响应给用户。遵循系统架构图,在表现层设计时采用MVC设计模式,控制器将用户请求从URL中解析出来,根据请求的资源和预先设定的原则,调用相应的Action以执行要求的操作。Action在此时充当了Model的角色,将处理的具体逻辑委托给Manager来实现,并获得Manager返回的结果,控制器根据这个结果和预先设定的View表现方式,组装数据并响应给用户。在实际应用中,我们在Web表示层使用w曲wdrk框架,它很好的是实现了MVC设计模式,前端控制器负责过滤和分发用户请求,并调用ActionInvocation来依次执行拦截器和Action,根据Result返回结果使用WebWorkTags和表现技术将结果呈现给用户。我们同样选取OrderFormAction为例,如下图:一 西南交通大学硕士研究生学位论文第54页马星婴匿篓l两磊志吲L———————————一1蒸渺|掣一目图5.14LSDF表现层类关系图如图5.14所示,FilterDispatcher(前端控制器)接受用户请求,根据配置文件xwork.xml中的设置,调用OrderFormAction的相应方法。OrdcrFormAction将业务逻辑委托给Manager类来完成。WebWork实现了MVC模式,它能很好和现有其他框架如Spring集成,通过Spring来管理和注入需要的对象实例,WebWork的拦截器和值堆栈是非常吸引人的特性,WebWork为每一次请求构建一个ValueStack,并将所有相关的数据对象放到ValueStack中,在Action中可以访问ValueStack中的内容,同时将ValueStack暴露给视图页面,这样页面就可以直接访问后台处理生成的数据,相当于在页面和Action之间建立~个共享区域。 西南交通大学硕士研究生学位论文第55页第6章WSH架构在应用系统中的实现基于W曲wjrk、swing和Hibemate的架构实现,由于采用轻量级框架技术,各框架之间的耦合度低,在关注自身实现的同时,只要在配置文件中指定连接属性,就可以实现相互关联。在应用系统需求分析和系统设计的基础上,本章主要通过具体的实例代码,详细分解了WSH架构在系统中的实现,同时通过实例分析了WSH架构的优势,如何体现WSH三者之间的紧密配合,如何体现三种框架的灵活性、兼容性、可扩展性等等,并抽象出可供重复应用的组件。在当前Web多层框架设计中就WSH框架所具有的优势进行深入探讨,为实现高效、灵活的多层w曲体系结构在实践中的应用提出了一种新的解决方案。由于整个项目所涉及的实现较多,我们仍旧采用OrderForm(订单)为例,说明系统的实现过程。根据详细设计和系统架构图,我们从持久层、业务逻辑层和表现层(模型层、视图层和控制器层)三部分分别加以实现,详细分析WSH架构的应用以及三者之间如何解耦实现。6.1WSH架构实现环境基于J2EE架构的应用程序,具有Java程序的基本特性:“一次编译,处处运行”。WSH架构的产品在开发和使用阶段对硬件条件没有特殊要求,在设计开发过程中,出于性能和效率的原因,我们采用了较为简单的Mysql数据库和Tomcat服务器,而在发布时采用功能较为完备的Oracle数据库和SunOne应用服务器。如下是系统的实现环境:操作系统:Windows2000servd数据库:Mysql5.0Web服务器:Tomcat5.5Java编译器:.IDK1.5.0开发框架:WebWork-2.2.2Xwork-I.I.3Spring-Framework-I.2.8Hibernate-3.0.5JDBC:MysqlJDBCDrivorvesion3.1.12开发工具:IntelliJIDEA5.1.2MagicDrawUML11注:开发本系统时所使用的是当时最新工具类包,本文完成时个别工具已有更新产品。 西南交通大学硕士研究生学位论文第56页6.2域模型对象实现域模型对象与数据库中的表结构相对应,就数据库的设计而言,在实际应用中有几种不同的方式:1.按照传统设计方式,设计数据库结构和表之间关系,通过工具从数据库表结构映射为*.hbm.xml文件和对应的Pojo类文件,如在MyEclipse下可以使用自带的插件来完成,或者使用Middlegen-Hibemate工具来完成从数据库表到·.hbm.xml,然后使用hibernate.extensions中的工具hbm2java来实现到Pojo的自动生成。2.可以直接手动书写4.hbm.xml文件,然后通过Hibernate提供的工具SchemaExportTask生成数据库表结构,使用hibernate.extensions中的工具hbm2java来自动生成到eojo类。3.按照UML的设计方式,从最初的用例分析到最终的类对象的建立。使用XDoclct代码处理引擎,在类文件中嵌入类似JavaDoe的标记称为XDoclet标记,来输入与某些标准要求相关的信息,XDoclet可以由被标记过的代码自动生成需要的配置文件或接口。利用XDoclet工具生成+.hbm.xml,再用Hibernate提供的工具SchemaExportTask生成数据库表结构。在本应用系统的设计开发中使用了最后一种方式。通过需求分析和详细设计,域模型类(也称为持久化类)对象的结构和相互关系已经基本确定。在Java的类代码中,加入XDoclet标记:,●●‘@11ibernate.classtable='’T_ORDERFORM”(1)●,publicclassOrderFormextendsBaseObjectimpicm-ntsSerializable{privmStriagid;⋯⋯//其他私有成员属性publicvoids训烈Stringid){也is.id=id;'{●●‘Returnstheid+@retumid+@hibernate.ideolurtm="F__ID”length="32”(2)‘unsaved-value=”version”‘generator-class=”uuid.hex”●, 西南交通大学硕士研究生学位论文第57页publicSari:aggetld(){return斌),●●‘Returnsthesum.‘@returnitat+@hi.hate.propertyeohmm=“FSUM”01.,publicintgetSum(){returnsum;)f●●+Remmsthecoupon.‘@returnCoupon’@hibernate.many-to-one(4)‘column--”FCOUPON_ID”’cascade=”save-update’’‘outer-join=’’false”●,publicCoupongctC∞pon(){retllrllcoupon;}l'●+@r蛳Returnstheproducts.+@hibernate.set(5)‘cascade=”save-update’’‘lazy=”false”‘inverse=”true”+@hibernate.collection-keyeolturm=”FORDERFORM_ID”+@hibernate.collection--one-to-manyclass=”cn.1sd£ebs.model,Product”●,publicSetgetProductsO{rctmnproducts;)⋯⋯其他属性的setter和getter方法}从以上的部分代码可以清楚的看到:类OrdcrForm继承了抽象类BaseObjeet并实现了Serializable(序列化)接口,序列化允许将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。所以,域对象与其他类相区别的一个地方就是要实现Serializable接口,只有实现了该接口,域对象才能持久化。1)在类定义之前定义T@Hibernate.classtable=”TORDERFORM”,table属性被设定为数据库中的TORDERF0ltM表。2)主键ID,使用@hibernate.id来声明主键,eolunm='’F_ID”length=”32”对应表TORDERFORM中的F-ID字段,采用generator-class=”uuid.hex” 西南交通大学硕士研究生学位论文第58页来设定id的生成算法。UUlD算法使用一个128-bit的UUID算法生成字符串类型的标识符,该算法使用口地址、JVM的启动时间、系统时间和一个计数值来产生主键,同时被编码为一个32为的十六进制数字的字符串。unsaved-value=’'version",通过version来确定在隐含情况下是否将数据保存到数据库中。3)在每个属性的get方法前J匾过@hibemate.property来设定该属性为持久化类的映射属性,column='’FSUM”确定该属性对应表中F_SUM字段。钔通过@hibernate.many-to-one来设定类对象之间的多对一关系,nFCOUPON11)”作为外键与Coupon类的主键D对应,cascade设定级联保存方式。5)通过@hibernate.set来设定类对象的一对多关系,cascade来设定级联保存方式,lazy=”false”来设定延迟加载,这有利于提高系统性能,inverse设定双向关联中的被动方一端。inverse=”false”的一方(主控方)负责维护关联关系,这里由Product作为主控方负责维护和OrderForm的关联。@hibernate.collection.key设定Product(产品)表中对应的OrderForm(订单)的外键。@hibernate.collection-one-to-many设定了“多”方的类全路径名。在生成了加入XDoclet标记的类文件基础上,使用xdoclet.modules.hibernate.HibernateDocletTask类来完成从类文件到数据库表结构的映射。这一过程,我们通过使用Ant工具(Ant是一种基于Java的build工具,其强大的功能使我们在开发Java应用程序时非常方便)来完成。生成OrderForm.hbm.xml文件如下:</set>吲class></hibernate-mapping>在第3.3节我们对于映射文件进行了详细讨论,在此就不再重复。使用Ant工具所生成的数据库表结构如下:从生成的表结构图可以看出,各个关联表之间的关系已经自动生成。 西南交通大学硕士研究生学位论文第60页6.3持久层实现图6-1LSDFOrderForm数据库结构图持久层是整个系统的根基,它控制着应用程序向数据库的读写操作,通过Hibernate的映射能出色的完成这一任务。就OrderForm的操作而言,向上层业务逻辑层提供了OrderFormDAO接口,而具体实现则在OrderFomff)AOHibernate类中完成。实现类继承了HibemateDaoSupport类,这是一个Spring提供的封装类,利用其提供的模板方法,可以方便的调用getHibernateTemplateO方法,返回一个hibemateTemplate类。直接使用该类提供的方法,来完成对数据对象的持久化操作。|●●j’OrderFormDAO(DamAccessObject)数据访问对象的Hibernate实现。++ViewSource</i></a>‘</p>’@spring.Beanid=”orderFormDAO”(1)+@spring.propertyname=”sessionFaetory’’ref=-”sessionFactory'。’,publicclassOrderFormDAOHibernatcextendsBaseDAOHibemate 西南交通大学硕士研究生学位论文第6l页implementsOrderFormDAO{,●●+@s∞cmBdf.e1%.da0.OrdcrFormDAO#saveOrderForm(Ord日FormorderForm)。I,l'I|blicOrderFormsaveOrderForm(OrderFormordcrForm){(2)getHibemateTemplateO.saveOrUpdate(orderForm);retu/llorderForm;},●●’@seeendsdf.ebs.dao.OrderFormDAO#getOrderFormList(QuoryManagerquery).,publicListgetOrderFormList(fmalQueryManagerquery){(3)rctl/rn(List)getHibemateTemplate0.execute(newHibernateCallbaekO{publicObjectdolnHibematc(Sessionsession)throwsHibematcExccption{QueryhibcmateQuery2session.creatcQud'y(qucry.getQucryStringO);if(query.getFirstResultO>O){hibemateQuery.setFirstResult(query.getFirstResultO);}if(query.gctMaxResult0>O){hibemateQuery.setMaxRcsults(query.getMaxRcsult0);}roturnhibernateQue'ry.1ist0;));)⋯⋯//其他方法}以上是实现类的部分代码:(1)使用XDoclet标记@spring.Bean和@sp咖g.property来设定依赖注入关系。(2)getHibernateTemplateO.save伽唯'da把(orderFo衄)使用模板类的saveOrUpdat方法持久化orderForm对象。(3)通过HibemateCallback回调接121,使用QueryManager自定义类和Session方法完成orderForm类的查询操作。OrderFormDAOHibemate类要使用SessionFactory工厂类实例变量,这个类对象由Spring容器来管理,通过注入方式供实现类使用。同样,通过运行Ant工具在applicationContext—dao.xml文件中自动生成对应关系: 西南交通大学硕士研究生学位论文第62页</property></Bean>sessionFaaoryBean的定义在初始配置文件(也可以放在同一文件)中定义。cn/lsdf/ebs/modeI/OrderFom[Lhbm.xml</value>⋯⋯./,其他映射文件</list></property>org.hibernate.dialect.MySQLDialect</prop>false</prop></props></property><,Be∞>6.4业务逻辑层实现业务逻辑层是整个应用的核心,接收表现层的用户请求,控制着应用逻辑的流程,并通过持久层完成数据的存取操作。就订单而言,向表现层提供OrderFormManager接口方法,具体实现则通过OrderFormMaaagerImpl完成:,●●·OrderFormManager实现,+@spring.Beanid=’'orderFormTarget”(1)‘@springpropertyname=”orderFormDA0”ref=”orderFormDAO’’+@spring.propertynamD=。'productDAO”rcf=”productDAO”●JpublicclassOrderFormManagerlmplextendsBaseManagerimplements0rderFormManager{ 西南交通大学硕士研究生学位论文第63页privateOrderFormDAOdao;privateProductDAOproductDAO;publicOrdexFormsaveOrderForm(OrderFormord日Fonn){OrderFormpo5null;if(orderForm.getld()=。null0ordcrForm.酬d0.1ength0f_32){po2newOrderForm0;orderForm.setld(null);orderForm.setCreamTime(DateUtil.getCurrentDateO);//更多属性在此设置}else{po=dao.geK)rderForm(orderFornxgetld0);,,新建订单//更新订单orderForm.setUpdateTime(DawUtil.getCurrentDateO);}try{BeanUtils.co刚州esO嘎orderForm);(2)}catch(filegalAccessExcepfione){log.error(e.getStackTrace());}catch(InvocationTargetExceptione){log.error(e.getStackTraee0);)retl2r13dao.saveOrderForm(po);}publicListgetOrderFormList(ResultBeanresultBean){(3)if(query2null){query2lleWQueryManager(”fromOrderForm");}resultBean.setTotalResult(dao.getOrderFormCount(query.getCountQueryO));query.setFirstResult(resultBean.getStart0);query.setMaxResult(resultBean.getLcngthO);rectumdao.getOrderFormLisKquery);},/设定set方法,通过Spimg的注入机制将对象注入到该实现类中供相关逻辑方法调用。publicvoidsetOrderFormDAO(OrderFormDAOdao){this.dao2dao;}⋯⋯//其他业务逻辑方法} 西南交通大学硕士研究生学位论文第64页以上是实现类的代码部分:(1)使用XDoclct标记@spring.Bean和@spring.property来设定依赖注入关系。(2)BeanUtils类存在于org.apache.co姗。璐.Beanutils包中,通过它的公有静态方法copyProperties(java.1ang.Objectobjoct,java.1ang.Objectobjectl)完成对象中属性值的拷贝。(3)getOrderFormList方法通过调用持久层dao.getOrderFormList(query)方法完成数据操作。OrderFormManagerlmpl类中所使用的orderFormDAO和productDAO是在配置文件applicationContext-serviee.xml中指定的,使用AntT具和XDoclct标记自动生成对应的关系。吲property></property></Bean>在前文我们说过,spring通过配置文件实现事务声明式管理,下面我们就具体加以说明:(--)指定transaetionManager,并将sessionFactory注入进去:(二)设定事务代理模板,并设定所需事务策略。PROPAGATION_REQUIRED</prop>PROPAGATION_REQUIRED</prop>PROPAGATION_REQUIRED,readOnly</prop> 西南交通大学硕士研究生学位论文第65页<:/lxops></property>啕Be∞’需要说明的是在TransactionProxyFaetoryBean里的transactionAttributes,它的prop元素中的key属性定义了目标类的某个方法,可以使用通配符,如save*,prop元素的值定义了对key中定义方法应用的事务执行属性,指定格式为:传播行为,隔离等级,只读,+异常,一异常PROPAGATIONREQUIRED:表示在当前的事务中执行操作,如果事务不存在就建立一个新的事务。(三)对需要进行事务管理的Bean,使用parent来指定代理模板,使用target来指定所代理的目标类。</Bean>Spring提供了一种类似于继承的机制来降低配置信息的重复并使XML配置更加的简单。一个子Bean可以从它的父Bean继承配置信息,本质上这个父Bean就像它的子Bean的一个模板。这是一个在大型项目中推荐使用的特性,所有要做的就是把父Bean的abstract属性置为true,并在子Bean中加以引用。6.5表现层实现在表现层我们使用WebWork实现MVC模式,就SystcmUscr注册而言,我们从MVC模式的三部分分别加以说明:v.表示层:在页面上使用WebWork标签组件(WebWork也支持HTML标签)接收用户输入的数据:<%@includefile=’'Icommon/taglibs.jsp”%>(1)</ww:form>以上是页面的部分代码:(1)页面中如果使用WebWork标签,在页面开始部分要引入标签库,通过《%@tagliburi=”/webwork”prefix--'’VcrW”%>实现,一般而言,将该引入语句放在一个公用文件中,在每个页面使用<%@includefile=””%>将其包含进来。(2)WebWork的form控件和HTML使用上基本相同,validate=’)title”刚表示使用客户端验证方式。(3)WebWork标签包含了HTML标签的所有内容,并在此基础上使用FreeMarker对HTML标签进行了封装,从而定义了功能更为强大的标签库。C:控制器层WebWork使用前端控制器FilterDispatcher接收用户请求后,通过读取配置文件xwork.xml,找到对应的Aedon类,xwork.xml中的配置如下:systemUserList,action</result>AVEB-INF/pages/systemUsednput.jsp</result></action>/WEB-INF/pages/systemUserList.jsp</result></action>值得注意的是,与Struts的Struts.config.xml不同的是,这里的多个Action 西南交通大学硕士研究生学位论文第67页都对应同一个SystemUserAction类,使用method属性值加以区分,method属性值对应了SystemUserAction类的不同方法,每一个方法完成一个功能。M:模型层应用程序使用一个域模型贯穿于各个层次之间,如SystemUser。当用户发出请求后,WebWork构建一个ValueStaek,并将所有相关的数据对象放到ValueStaek中,并为数据对象赋值。我们再进一步看看对应的SystemUserAction类是如何实现的:publicclassSystemUserActionextendsBascA嘶0n{privateSystemUsersystemUscr;(1)publicSUingsave()throwsException{ff((systemUser.getld0=null0systemUser.getld0.equals(””))(2)&&!systemUserManager.109inNameValidate(systemUser.getLoginName0))(super.addFieldError(”systemUscr.109inName'‘,”对不起,用户名”+systemUser.getLoginNameO+“已经注册了。请重新选择用户名!”1;rctRrnINPUT;}⋯...,,其他操作方法systemUser2systemUserManager.saveSystemUser(systemUser);(3)r融nlllSUCCESS;}以上是SystemUserAction类的部分代码:(1)systemUser对象是在该类中使用的对象,用户请求时(即页面中的name=”systemUser.109inName”等控件),ValueStaek将用户的输入值填充到对象属性中。(2)服务器端再次捡查用户信息(在客户端已经对其合法性检查过)是否有异常和重名现象,并将错误信息加入到错误列表中,以便返回时在客户端用户界面上显示。(3)SystemUserAction的Save方法,并不直接对数据库进行操作,而是委托给systanUserManager的saveSystemUser方法来完成,如果未出现异常情况,则返回SUCCESS,将转向到预先在配置文件中设定的页面。6.6应用组件设计在本系统实现过程中,根据架构设计的目标,设计了大量可重复使用的组件。对象管理组织对组件的定义是:组件是一段具有自己的数据和逻辑的自包 西南交通大学硕士研究生学位论文第68页含的软件代码,并且具有良好的与外界通信接口。组件可被用来构造其它软件,可以是被封装的对象类、一些功能模块、软件框架、软件构架,文档、分析件、设计模式等。本应用中共包括一下几种组件:1.数据加密组件:对于任何系统而言,数据加密是一个必不可少的重要部分,如何使用户信息在网络上安全的传递已经成为Web应用技术的重中之重。本电子商务平台中包括用户注册信息,用户帐号等敏感信息,因此数据加密组件就显得格外重要。本系统中采用MD5,SHA算法对相关信息加密。jakl.5版中对安全性方面有了很大的改进,我们使用java.security.MessageDigest类提供的方法,完成数据信息的加密工作。2.数据分页组件:从数据库读取大批量数据时,系统必须提供数据库分页组件。同时分页组件也有2类:一类是一次性从数据库中取出所有数据,放入内存,然后进行分页处理。另一类是根据每页的大小和偏移量取出数据,每读~页数据,都依次从数据库中读取。使用前者时,当数据量很大时,内存消耗很大,使用后者时,每读取一页,都要访问数据库,增加了网络通信量。本系统使用Hibernate提供的分页技术,在进行查询分页时具有很大的灵活性,Hibornate会首先尝试用特定数据库的分页SQL,如果无效,那么Hibernate会使用JDBC2.0的scrollableresult,如果不行,最后采用rg.next)移动的办法。在查询分页代码中使用Hibernate的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。3.验证码组件:本系统提供验证码生成器组件,来产生验证码图片,加强系统的安全性。验证码生成器组件为一标准的servlet类,通过在应用根目录下的web.xml中配置便可。本系统配簧如下:q州lct.n缸ne)CodeIInageServlet叫∞Ⅳlet.name>eodelmage</display-name>generatelogincodeimage</desta'iption>cn.Isdfiebs.webapp.servlet.CodelmageServlet</servlet-elass></scrvlct>CodelmageServlet</servlet-name>/codeImage</url-pattem></servlet-mapping> 西南交通大学硕士研究生学位论文第69页其实现效果图如图6-2所示。图6-2LSDF登录界面4.Web层Freemarker表现组件:FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,FreeMarker被设计用来生成HTMLWeb页面,特别是基于MvC模式的应用程序,由FreeMarker生成页面,通过模板显示数据。FreeMarker不是一个Web应用框架,而适合作为Model2框架(如w曲WDfl【)的视图组件,同时也可以在模板中使用JSP标记库。由于其良好的兼容性,本系统基于Freemarker模板引擎,设计了很多可重用组件作为Web表现层组件,包括分页显示组件、搜索条组件、自动拼写完成组件等。分页显示组件在WebWork中的使用:</ww:component>其实现效果如下;图6-3LSDF分页组件效果图搜索条组件的使用:CONVERTURLTOLOWERCASE_BEFORECOMPARISONPATTERN_TYPE_APACHE_ANT/¨-httpS铭si∞con觚tm咤mti衄Fil溉1090u删t%autlI如ticationProc鹤sjngFil氓s鲫嘶tyContexⅡ{oIde峭wareRequestFilte哪m锄b洲eProc髓singFilteL锄m码7InollsProc嚣singFilteLexceptionTranslationFilter,filterlnvocationInterceptor</value></property></BP_an> 西南交通大学硕士研究生学位论文第71页本应用中使用过滤器来管理用户的请求信息,防止用户非法访问,在web.xml文件配置过滤器:securityFilter</filtcr-name>org.acegisecurity.util.FilterToBeanProxy</filter-class>targetClass</param-narne>org.acegisecurity.um.FiltcrChainProxy</param-value></init-param></filter>、secufityFilter</filtex-name>/j_acegi_sccurity_check</url-pattem></filter-mapping>securityFilter</filter-name>+.action</url-pattem></filter-mapping>securityFilter</filter-name>+.jsp</url-pattem></filter-mapping>6.7.2自定义安全控制本系统除了使用Acegi安全框架外,还自定义了一系列安全控制机制加强来自URL和模拟应用的攻击。1.限定使用期限在WebWork的工作流程中,执行Action前后要自动执行一系列设定好的拦截器,其中的ParametersInterceptor参数拦截器的作用是从ActionContext中获取所有参数,并将它们赋值给OgnlValueStack,以便在Action中使用。我们改造了xworkjar文件,增加了一个auth.properties属性文件,其中指定了一个expiredTime属性,可以人为设定时间有效期限,同时改写ParametersInterceptor参数拦截器类,使它在进行参数赋值时,首先读取一个授权属性文件中的expiredTime,判断当前日期是否在有效期内,否则就终止当前操作,并在页面提示出错信息,同时在日志中记录: 西南交通大学硕士研究生学位论文第72页在logs中:2006-10-2811:07:38,828FATALhttp一8080-Processor23c彻Lopens)啊田)110fl*xwo^Lhne“x4舰P铀篇Ⅱ砖螂hlt日Deptor—Licenseexpired!!PleaseConnectadministrator!其类关系图如下:匡雪鼍一一目圈6-5LSDF限定使用期限类关系图2.有效性验证在w曲Work中,我们知道所有Action类都要实现tom.opensymphony.xwork.Action接口,并实现其中的Execute方法。WebWork为我们提供的另一种更为方便的方法是Action类继承ActionSupport类,AetionSupport类实现7"Action、ValidationAware等接口,并且为它们提供了基本的实现方法,同时我们在使用中可以根据具体需要重写对应方法。如果我们使用基于配置文件的输入验证,要求Action必,须继承ActionSupport类。在应用中,我们使用了一个中间类ActionSupportProxy,作为ActionSupport类的子类,同时作为所有Action类的父类,如图:图6-6LSDF有效性验证类关系图在ActionSupportProxy类的构造函数中调用验证方法,其中又用到了Right类,Right类读取“MD5.xml”文件,其中包含Txwork-1.1.3.jar和webwork-2.2.2.jar这两个文件的路径和摘要信息。上文已经提到,我们曾经更改过xwork-1.1.3.jar,所以它具有唯一性。在应用中,当系统产生Action对象时,要执行其父类的构造甲留色一 西南交通大学硕士研究生学位论文第73页函数,则此时通过读取MD5.xml文件中的路径信息获得xwork-I.1.3j缸和webwork-2.2.2jar;丈件的位置,通过MD5算法计算出摘要信息,-与M05.xInl文件中的摘要信息比对,从而确定是否为合法请求。注:鉴于实际系统的安全性考虑,未对具体代码进行分析。6.8其他应用设计1.Aiax应用技术与传统的Web应用不同,AjaX(异步JavaSoipt和Xml)技术采用异步交互过程,在用户与服务器之间引入一个中间媒介,从而消除了网络交互过程中的处理一等待一处理一再等待的缺点。WebWork通过引入Dojo库对Ajax提供支持,使WSH框架能很好的与之兼容,实现无刷新请求服务。WebWork对Ajax的支持主要是通过引入tag来实现。tag的主要功能包括:a1动态刷新页面中的某一部分。这一部分封装在一个div中,通过轮循方式或者事件触发的方式来改变其内容。理论上可以在div内放入任何内容。b1通过一个a超链接或submit按钮来执行~段JavaScript,可以触发一个事件。事件模型是由DOJO库来定义的。c1可以生成tabbedpane,使用tab切换不同的内容,也可以在切换的同时触发一个事件。d)还有一个tree控件,同样使用w曲w6rk新增的协g来生成和配置。2Hibenate监听器技术在应用系统设计中,数据操作日志对于系统异常检查、数据核对和责任追究等都具有重要意义,有几种方式可以实现对数据操作的监听和记录:a)数据库触发器:当数据发生更新或删除时可以触发数据记录事件。b1Hibernate监听器:可以继承org.hibernate.event.clef包的DefaultSaveOrUpdateEventListener和DefauitDeleteEventListener类实现事件记录操作。在设计中我们采用第二种方式,通过重写onSaveOrUpdate和onDelete方法,当Hibernate对数据进行插入、更新和删除操作时,将操作数据的用户、时间、操作对象和操作结果以数据记录的方式记录在数据库中,部分代码如下:publicvoidonSaveOrUpdat“SaveOrUpdateEventevent)throwsHibernateException 西南交通大学硕士研究生学位论文第74页super.onSaveOrUpdate(event);finalSessionlmplementorsource2event.getSessionO;finalObjectobject=event.getObjectO;3Spring测试技术在任何系统设计中,框架的彻底的单元测试是非常重要的,完善的测试技术使应用的设计者能够将问题尽早的暴露出来,在有限的范围内加以解决,以便向使用者提供一个稳定、健康、高效的服务。因此在本应用中,测试几乎伴随着设计的每一步,在持久层和业务逻辑层设计中,Spring中的org.springfi'amework.test包提供了大量的测试类,使基于IoC的单元测试变得非常容易。测试类只要继承AbstractDcpendencylnjectionSpringContextTests类,可以方便的通过配置文件注入需要的类对象。如下图:}_目_盯_clu呷一。一。’,1'’’”’_。-_’。_,一一千l-h·a^on砷c·_jl?。””—”9‘”7千lofderFanmD^oT·●t瞄:怒黧删器湍一图6—7LSDF测试类类关系图通过进行单元测试,使WSH框架的各层次功能在本层次内就能加以验证,模拟实际使用环境,将出现问题所产生的影响降到了最低,极大的提高了分布式开发团队的工作效率。6.9WSH集成架构的特点在整个系统设计实现过程中,我们一直以架构设计的目标为着眼点,虽然不同的实现有其具体特点,但在实际应用中力求使架构的设计能够满足这些目标。通过本系统的设计实现,集成WebWork、Spring和Hibernate的WSH架构具有以下特点: 西南交通大学硕士研究生学位论文第75页●合理的设计思想、WebWork是基于MVC的框架,它很好地把业务逻辑和表示层分离。由于WebWork在对象持久化和业务对象管理方面尚存在一定的不足,基于WebWork的良好兼容性,采用Spring和Hibernate框架予以补充。Spring是一种轻量级容器,利用依赖注入方式实现对象的初始化,使得开发人员减轻了初始化对象的负担;同时利用AOP机制进行事务管理,全面降低了构建企业应用的复杂度。Hibernate是一个轻量级的对象持久化工具,它能很好地将实体对象与数据库表的记录相对应,而且通过统~接口屏蔽具体数据库的差异。●团队化协作开发本架构使用分层技术实现,分为表现层,业务层,持久层和领域模型层。各层次之间的关系通过三种框架解耦,层与层之间边界清晰、功能尽量独立,对于同一层次的不同的业务逻辑基于模块划分,使得整个系统既可以横向分工,也能纵向分工,能充分发挥团队化协作能力,使开发人员充分发挥各自的特长。●良好的兼容性本架构所使用的三种框架技术都是开源技术,它们三者之间以及和其它框架之间能够很好的兼容。WebWork的表现层除了使用却之外还可以使用Freemarker、Velocity等模板技术作为表现技术;通过引入Dojo第三方类库,可以使用Ajax进行异步请求操作。Spring作为轻量级管理容器,可以和Acegi安全框架无缝兼容,满足了在安全控制方面的不足;同时它和Hibernate框架的兼容,使对象的持久化操作更加便捷。●重用和模板化设计wSH框架技术是基于模块化设计的,相互分离的各层之间,某一层的改动不会影响另一层,这样为业务逻辑的重用提供了可能。在设计中抽象出功能相同的部分作为通过模块使用,充分利用已有的工具集加速开发进度。在类建立过程中,通过使用XDT模板文件,利用AntT具完成大量重复性工作,在表现层技术上设计了大量Freemarker模板,模板化是开发设计中的重要组成部分。●高效的性能和开发效率Spring使开发人员直接使用类对象,而不用考虑具体的生成方式,集中精力关注于业务对象的处理。Hibernate技术规范对底层数据库操作进行了大量的优化,提高了系统性能,其O/R设计,使开发人员可以随心所欲的使用面向对象编程思想来操纵数据库,无须关心对象本身及其关系如何在数据库中存储,。相对于使用JDBC和SQL语句来手工操作数据库,大大减少了开发数据库的工作量。 西南交通大学硕士研究生学位论文第76页●可扩展性和移植性WSH架构是基于J2EE平台的,Java的天性就是平台无关性。Hibernate作为持久化框架向上屏蔽了不同数据库问的差异,可以很容易移植到不同的数据库;Spring的Bean对象通过配置文件使得开发人员可以不用书写任何代码,在不经改动的情况下移植到另一个IoC容器。架构各层次之间是独立的,通过接口进行交互,对于系统扩展而言,只要实现同一接口,可以方便的对系统功能进行扩充和维护。坦率的讲,集成WebWork、Spnng和Hibernate的架构也并非没有缺点,任何一种框架技术都有其不足:WebWork框架本身对开发人员要求较高,必须要了解其内部的实现机制,才能更好的应用它,从而也限制了它的使用范围。Spring和Hibernate虽然是非常成熟的技术,但对它们的学习需要一个持久的过程,其配置文件相对复杂,让不少初学者头疼。开发者需要对MVC和分层技术有一定了解,才能正确的将该架构应用于在企业系统开发中。 西南交通大学硕士研究生学位论文第77页总结与展望随着网络技术的飞速发展,基于Web应用系统越来越多的进入开发人员的视野,而以往普遍存在的程序可重用度低,维护任务繁重、扩展性和兼容性差等问题同样困扰着开发人员,如何快速构建稳定、高效、可扩展性和维护性强的应用系统是众多开发人员追求的目标。本文针对以上问题,结合作者开发经验,从分析Web应用本身出发,将关注点也逐级提高,总结出软件开发过程中一个逐步抽象的过程:代码一模块一模式一框架一架构。模式,简单说类似于定式,就是遇到反复出现的同一问题时所固定使用的解决方案,通俗的讲类似于“棋谱”。框架技术为软件开发带来了更度的重用性,同时它也需要更高技巧的设计。架构是由不同领域的框架组成,因此架构的建立及维护其稳定性,是构建高质量软件产品关键。面对传统开发越来越难以适应现代化软件开发的要求。本文通过对J2EE框架和MVC模式的分析,通过对比MVC的实现技术,集成WebWork、Spring和Hibernate框架形成了一个具有一定集成度和通用性的WsH架构,并结合四川省乐山大佛电子商务平台项目的开发,具体阐述了如何使用WebWork作为Web表现层框架,而将业务逻辑委托给以Spring为框架的业务逻辑层处理,最后将对数据的操作交给以Hibernate为框架的持久层来完成。通过分层处理使整个系统结构清晰,功能明确,更重要的是各层次之闻相互独立,对某一层次的修改不会影响其他层次。通过运用集成框架,使层次间的耦合性降到最低,这就为软件的重用化和组件化创造了条件。●论文研究成果:1.通过对本文的研究,我们可以看出架构设计重要性,一个好的软件架构是成功开发的关键。合理的架构可以避免重复设计,减少开发风险,增强软件的可扩展性、可维护性及可移植性,提高软件质量和性能效率。2.对比J2EE开发平台的多种实现技术,在对架构设计进行深入分析的基础上,提出了集成WebWork,Spring和Hibernate的架构设计方案,详细分析了三种框架之间的关联关系、交互关系和权责分工,定性的分析了三种框架技术在J2EE框架中的位置。重点讨论三种框架技术的整合,对实现技术做了一定的归纳分析。3.在具体应用项目的实现中,WSH架构良好的兼容性使我们在开发过程中,充分利用已有的框架技术满足系统的开发要求:设计之仞采用 西南交通大学硕士研究生学位论文第78页Xdoclet标记和Ant工具完成对象关系映射和自动生成配置文件:使用Aeegi安全框架实现系统安全和用户访问控制;使用Aja)【技术实现远程异步访问;使用Freemarker模板作为表现层技术;使用JUnit测试技术完成系统测试。4.四川省乐山大佛电子商务平台项目的设计实现是在WSH框架的基础上进行设计和开发的。一旦投入使用,乐山大佛管委会各部门、科室及所有相关办公人员都可以在网络上处理同常工作,包括登记票务、优惠统计、客源分析等,同时用户可以通过网络实现网上订票、网络支付等。大大提高旅游管理部门和游客之间的协作效率。●工作中的不足及展望:尽管论文已经完成了预期的研究目标,但是还有一些工作需要进一步完善:1.随着w曲应用技术的发展,更优秀的框架技术不断涌现,在以后的学习中不断深入对组件、复用等相关技术的理解,力求设计更加满足实践要求的架构技术。2.Spring框架技术所涵盖的范围非常广泛,SpringMVC也是MVC模式的实现框架之一,s硼ng和ACEGI安全框架的无缝结合,s两ng对Hibernate框架的模板化封装都值得进一步学习和研究。s埘ng支持的AOP的编程方式模块化了横向关注点的实现,提供了一个更好更快的软件开发方式。3.对数据访问性能和效率有较高要求的应用开发中,Hibernate也推荐使用自定义或第三方的连接池。连接池缓冲技术能够极大提高系统的响应和数据处理速度,在以后的学习中,将进一步予以关注,并深入研究和探索。综上所述,通过本论文,深入研究了J2EE架构技术,并提出了集成WebWork,Spring和Hibernate的架构设计方案,通过四川省乐山大佛电子商务平台项目予以验证,并在某些方面有所些创新,延伸出一些新的特性,为实现高效、灵活的多层Web体系结构的应用提供一种新的思路及方案。 西南交通大学硕士研究生学位论文第79页致谢时光荏苒,转眼间历时两年多的研究生生活即将结束,也许这篇论文就是学生生涯的休止符。弃笔掩卷,回想这难忘的时光,轰轰烈烈过眼烟云,平平淡淡笔下情真。两三载同窗情谊,几十年交情难忘。回想研究生生活中,要感谢人真的很多。首先我要感谢的是我的导师一一黄洪副教授,在此向他表示衷心的感谢和最崇高的敬意。感谢他这么多年来对我生活上无微不至的关心和照顾,在学业上的悉心指导和大力支持。黄老师的谆谆教诲和耐心指导是本文完成的关键。黄老师具有深厚的理论基础,严谨的治学作风,持之以恒的工作态度,百折不挠的乐观精神,为我树立了为人和为学的典范。从黄老师的身体力行中,我受益良多。感谢我所有教过和没教过我的老师,是你们的辛勤工作,让我的学校、我的生活更加精彩,也让我体会到了什么是感激。感谢我实验室的同学们,是你们在我困难的时候给我欢笑、在我迷茫的时候给我启迪、在我失望时让我鼓起勇气,在此衷心感谢王艳、田颖、李霞、何鹏、邵明武、罗桓、袁靖华,感谢你们对我的帮助,让我们一起渡过了一段难忘的时光。感谢北京迈普世纪科技有限公司成都分公司的全体同事,让我有机会参与项目研发,特别感谢章沛,在我工作学习过程中给予了大力指导和无私教诲。正是他们的帮助让我更快的成长。最后我要提到的是,带我来到这个世界的父母,他们的恩情是不能仅仅用感谢来表达的,是他们的支持和鼓励,让我迈过了人生一道道难关,也正是他们对我的爱,让我不断翻越人生的高峰,继续快乐的生活着⋯⋯在此不能一一感谢所有帮助过我的人,我只能在心中默默祝福他们,愿他们永远平安、快乐。马崇启2007年3月 西南交通大学硕士研究生学位论文第80页参考文献[1】MattRaible.SpnngLiveSoureeBeat,LLC,2004.【2】2SoarW.Ambler.鲁棒的数据库持久层设计【3]夏昕编著.Spring开发指南[4】CraigWails.RyanBreidenbaeh.SpringinAction,MannmgPublicationsCo.2005【5】MartinFowler.InversionofControlContainersandtheDependencyInj∞tionpatternhttp://martinfowler.oam/articles/iniection.html2004.1f6]hap://www.dearbook.earncWopensource2/index.∞p%开源大本营【7】夏昕曹晓钢唐勇.深入浅出.Hibernate.电子工业出版社,2005-5[8】刘洋编著.精通Hibemate.北京:电子t业出版社2005.5[91CraigLarman著.UML和模式应用,姚淑珍李虎等译.北京:机械工业出版丰七2002.1【10】RamezElmasriShamkantB.Navathe著.数据库系统基础(第三版)邵佩英张坤龙等译.北京:人民邮电出版社2002,11【ll】ChristianBauerGavinⅪng。HibernateInAction.ManningPublicationsCo.,2005[12】AlanMounox著.J2EE快速开发.武欣董怡然等译.北京:机械工业出版社,2006.1【13】TimonthyC.LethbridgeRobertLaganiere著.张红光温遇华等译.面向对象软件工程.北京:机械一E业出版社,2003[14】罗红梅.集成Hibernate、Spring和Struts的架构应用研究.电子科技大学硕士论文2006.3【15】MattRaible.AcegiSecurity2006[16】EJB3.0ExpertGroupJSR220:EnterpriseJavaBeansTM,Version3.0EJBCoreContractsandRequirements.SUNMICROSYSTEMS.INC.2006[17】Dave.CraneEric.Pascarello.AJAXInAction。ManningPublicationsCo.2006【18】罗时匕.精通sp—n卜开发专家之SunONE.电子上业出版社,2005-4.【19】CayS.Horsanann,GaryComell.CoreJavaTM2:VolunmlI-AdvancedFeatures.PrenticeHallPTI乙2001.12.[20】PATRICKLIGHTBODYJASONCARREIRA.WebWorkInAction.ManningPublicaliOIlSC02006[2I】孙卫琴.精通Hibernatelava对象持久化技术详解.北京:电子工业出版杜,2005.5[22】结城浩著.设计模式在Java语言中的应用.博硕文化译.北京:中国铁道出版社,2005.3【23】HibernateReferenceDocumentation3.1.ht|D://www.hibemate.org/hibdeos/v3/referenee/ewhtmF[24】TedN.Husted,CedricDumoulin,GeorgeFranciseus,DavidWinteffeldt.StrutsInAction.ManningPublicationsCo,2002【25】Crawford,WKaplan,J.J2EE设计模式.刘绍华毛天露译.北京:中国电力出版社,2005.4[26】Shalloway,Alan.Trott,James.Designpatternsexplained:anewperspectiveonobject-orienteddesign.北京:ChinaMachinePress.2006 西南交通大学硕士研究生学位论文第81页f27】TarakModi.Java安全前景.http:l/www:fawentte.toro/speciaFsecurity/modi2/[28】孙卫琴.精通Strum:基于MVC的JavaWeb设计与开发.北京:电子【业出版社2004【29】MichaelC.DacontaKevinT.SmithDonaldAvondolioW.chyRichardson著.MoreJavaPitfalls中文版.徐波赵科译北京人民邮电出版社,2004.1【30】白清源.基于J2EE和MVC模式的Web应用研究,西南交通大学硕士论文,2005.5[31】VincentMass01.JUnitinAorion.ManningPublicationsCo.,2004[32】Kuchana.ParthaSoftwareArchitectureDesignPaRemsinJava.ACRCProsCompany,2004【33】陈华军.J2EE构建企业级应用解决方案.北京:人民邮电出版社,2002【34]ArringtonCT马波李雄锋,EnterpriseJavawithUML中文版.北京:机械工业出版社。2004【35】Jaeobson,Ivar.Object-orientedsoftwareangineering:4u辩easedrivanapproach面向对象软件工程.北京:人民邮电出版社,2003.【36】TarakModi.J2EE架构的6个最佳实践.htlp://www.fawcette.cem/special/J2EE/modij卫l/【37】薛四新贾郭军主编.软件项目管理.北京:机械工业出版社,2004.5【381表现层框架Strms/'Tapestry/JSF比较.http://dev.yesky.com/497/2253497.shtml[39】Fowler,Martin.UMLdistilled:abriefgtudetOthestandardobjcc£modelinglanguage.jt京清华丈学出版社.c20f16.[40】Rumbaugh,James;Jacobson,Ivar;Booeh,Grady.Theunifiedmodelinglanguagereferencemanual.北京:科学出版社。2004.[41】蔡剑景楠,JavaWeb应用开发:J2EE和Tomcat.北京:清华大学出版社2005[42】孙卫琴李洪成.Tomcat与JavaWeb开发技术详解.北京:电子工业出版社,2004[43】Xdoclet参考引用.http://xdoclet.sourceforge.net/xdoclet/【44】HerbertSchildt.Java2:TheCompleteReferenceFifthEditionJava2参考大全.周志彬吕建宁章小莉等译,北京:电子。l:业出版社.2003,l[45】I锄∞,Craig.App蛳agUMLandpartems:∞introductiontoobject-orientedanalysisanddesignandtheunifiedproeess.北京:中国电力出版社,2004[46】Johnson,Rod;Hoeller,Juergen;Arendsen,A1ef;Risberg,Thomas;蒋培.Spring框架高级编程ProfessionalJavadevelopmentwiththeSpringframework.北京:机械工业出版社.2006f4刀RodJolmson.Beans,BeanFaetoryandtheApplieationContext[EB/OL].http://www,springframework,org/does/reference/benm.html#beans-factory-classD8】MartinFowler.ReducingCoupling【EBIOL].http://www.martinfowler.enm/ieeeSoflwareleoupling.vdf.2001.【49]D.Jordan.AnoverviewofSun'sJavaDataObjectspeeiflcation[EB/OL].http://www.objeetidentity.eom/images/jdooverview.Dd£【50】陈宗娇.基于Struts+Spring+Hibernate多层框架的Web应用系统研究与实现.辽宁工程技术大学硕士论文2006.3【51】鲁晓东李育龙杨健.JSP软件工程案例精解.北京:电子工业出版社,2005.1[52】Mahemoff,Michael.AjaxdesignpatternsAjax设计模式.南京:东南大学出版社,2006 西南交通大学硕士研究生学位论文第82页攻读硕士学位期间发表的论文及科研成果[1]马崇启,罗桓,黄洪基于LotusDomino的铁路人事系统安全机制分析,铁路计算机应用(已录用)[2】罗桓.马崇启,黄洪Lotus平台下报表的OLE技术的详细实例分析,铁路计算机应用2006年第11期[3]参与开发铁道部“成都铁路局办公自动化系统”项目,现已投入使用。[4】参与设计开发铁道部“成都铁路局人事管理系统”项目,现已投入使用。[5]参与设计开发四川省乐山大佛电子商务平台项目。 集成WSH架构技术的Web应用研究与实现作者:马崇启学位授予单位:西南交通大学相似文献(10条)1.学位论文欧阳任海PTGGUI系统研发及软件重用技术研究2004随着软件成为当今社会越来越重要的一个领域,人们对开发有效的、健壮的、复杂的软件需求也日益递增.虽然,我们在计算、网络、编程语言以及软件方法学等方面取得了显著的进步,但是在财务预算范围内,按时完成高质量的软件开发仍然存在不少困难.软件业所能分发的软件量越发不能满足社会对软件日增的需求.为什么会出现这种软件危机呢?这主要是因为当今软件业的大多软件开发效率不够高、成本大、维护费用昂贵等原因造成.而解决这些问题的一个实际有效的措施便是软件重用(SoftwareReuse).软件重用是提高软件开发过程产品效率以及软件质量的一个最重要的方法之一.软件重用包含对软件产品、框架、构建、代码等的重用,也包括对开发可重用软件过程的重用.至今为止,软件重用领域里已经出现了相当数量的软件重用技术.该文主要以基于ThalesATM公司的Eurocat-2000系统PTG部件(CSCI)之上的PTGGUI部件研发为背景,阐述了项目开发过程中所涉及或所使用的一些软件重用技术.这些技术包括面向对象技术(ObejctOrientation)及面向对象方法学(00Methods)、设计模式(DesignPattern)、框架(Frameworks)技术、重构(Refactoring)技术以及软件生产线(SoftwareProductLine).最后总结了软件重用遇到的问题,以及提出了实现软件重用及重用的顶点-软件生产线-几点建议.2.期刊论文肖统民.XIAOTong-min基于设计模式的可重用Web数据库应用软件的研究-计算机与现代化2006,""(7)Web数据库技术是现代计算机技术中的热门研究课题.本文针对目前一些Web数据库应用软件复用性不高的问题,结合高层次软件重用技术的重要手段--设计模式,提出了具有较高复用性的Web数据库应用软件系统结构,并开发了一个分布式货物库存管理系统.该研究从较高抽象层次保证了Web数据库应用软件的可复用性,并说明了设计模式在软件重用中的重要性.3.学位论文李歆基于J2EE设计模式的Web应用模型研究与实现2005为了推广J2EE的应用,相关机构和专家收集、整理了J2EE设计模式,帮助广大设计人员迅速掌握J2EE应用的设计方法。J2EE设计模式就是设计与开发J2EE应用程序时所遇到的常见问题的最佳解决方案。  鉴于当前国内Web应用开发多数结构混乱,代码重用率低,本文根据J2EE设计模式建立了一个Web应用模型,并通过构建一个应用实例的方式来阐述该模型的应用,并且从中归纳出同类应用可参考的框架和思路。从而研究国内外设计模式的一些最新成果,探讨设计模式层次上的软件重用。  本文的组织结构如下:  第一部分:主要介绍当前软件重用技术的发展状况,设计模式的来源以及对GoF设计模式分类及其使用作一回顾。  第二部分:首先介绍企业应用体系结构、J2EE的体系结构、基本思想及相关的应用。其次介绍J2EE核心设计模式的定义、分类和各自的使用范围和特点。该部分为Web应用奠定了理论基础。  第三部分:提出一个Web应用模型,把它用于一个Web应用中,并给出该应用的需求说明、总体设计、系统体系结构和总体开发策略和所使用的框架作一介绍和说明。该部分完成了系统概要设计部分  第四部分:该部分根据前一部分的设计,从Web层和、业务层实现系统功能,并采用各类J2EE设计模式实现代码优化和介绍相关对问题所采用的策略和方法。该部分完成系统详细设计部分  第五部分:对本文J2EE和设计模式的研究和应用作一总结,并对未来的发展趋势作出展望。4.学位论文徐亮设计模式在列控中心软件测试平台中的应用研究2008软件重用是解决当前软件危机的重要方法,而设计模式又在软件设计重用中占有重要的地位,它能够有效提高软件设计的效率和质量。可是,当我们进行软件设计时,众多的设计模式又常常使我们无所适从,这就需要我们以一种有效的方式将众多的设计模式组织起来,以便于设计人员能够快速地应用恰当的模式和模式组合。软件测试技术的自动化是软件测试的发展趋势,它能完成许多手工测试无法实现或难以实现的测试。正确、合理地实施自动化测试,能够快速、彻底地对软件进行测试,从而提高软件质量,节省经费,缩短产品发布周期。对列控中心测试平台中站场CAD建模及数据生成子系统的研究及开发就是在这样的背景下展开的。本文研究的内容围绕两个部分:列控中心测试平台的软件架构及设计模式在站场CAD建模及数据生成子系统中的应用及实现。全文介绍了设计模式、CAD技术的概念、列车控制系统的发展现状、软件测试理论等基本内容。在此基础上,结合实际课题任务,提出了适用于列控中心测试平台的设计模式,详细论述了站场CAD建模及数据生成子系统中设计模式的应用及实现。5.期刊论文涂建光.边馥苓基于设计模式的组件化GIS软件开发方法-武汉大学学报(信息科学版)2005,30(1)从软件重用和软件组件化角度出发,对组件化GIS软件开发在组件划分、组件组织、组件组装过程中的几种设计模式进行了深入研究.通过工程应用实例,论证了设计模式的有效性和实用性,旨在使在GIS研究中注重设计模式的应用,使GIS软件的开发更加规范化,从而提高GIS软件的开发效率.6.学位论文王志峰基于设计模式的软件复用及其在PACS中的应用2002在我们设计PACS时,采用了基于设计模式的设计方法.使用成熟的模式,方便了工程人员间的交流,提高了通用性,为可能的复用打好基础.在论文的第5章较为详细地介绍了我们设计的PACS中所体现的部分模式,介绍了复合模式的概念和一个重要的复合模式MVC,并介绍了图象处理子系统的核心类.作者的工作主要体现在以下几个方面:●对PACS进行需求调研,形成领域知识,并采用UML表示这些领域知识.●利用设计模式进行PACS的整体设计,详细设计,以及编码.●从方法学的角度,讨论了GoF设计模式间关系的不足,并由此引出了设计模式的层次化.●讨论了设计模式的形式化和建模,并结合PACS进行了详尽的阐述.7.学位论文许辉.NET下的设计模式在WEB系统开发中的应用与研究2006本文主要研究怎样选择和重用已有的设计模式,以及在新的开发环境之下设计模式的发展,其主要的内容如下:1.详细描述了23种成熟的设计模式及其应用的环境,深入研究如何根据实际开发情况选择合适的设计模式来提高开发效率。2.介绍了.NET作为一种新兴的开发平台的发展、组成和主要特点,主要研究了设计模式和.NET优势的融合,特别是工厂模式、外观模式和代理模式等,在.NET这一新的开发环境下的发展,提出了适用于Web项目的软件开发规则。3.将以上研究内容成功地应用到发电厂的调度自动化信息系统开发中。8.期刊论文刘蕴珊.刘列励.LIUYun-shan.LIULie-li设计模式在信息系统中的应用研究-信息技术2008,""(10)从软件重用角度出发,深入研究了五种典型设计模式,并在实际系统的不同模块中进行了综合实践,提高了系统开发的规范性和开发效率,从而增强了系统的可复用性和扩展性.通过工程应用实例,论证了设计模式的有效性和实用性.9.学位论文张敏数据驱动的J2EE应用开发方法的研究及其自动化代码生成工具的设计2005软件重用的研究一直是软件开发过程中非常活跃的研究领域。设计模式思想的发展,为根本改善目前软件生产成本高、效率低的状况,为实现软件由作坊式生产向工业化生产的飞跃,带来了机会。目前基于设计模式的软件复用成为了软件开发研究的重点。本文以设计模式和软件重用理论为基础,研究和设计了一个基于数据驱动的J2EE应用代码生成工具CodeGenerator。该工具适用于所有采用特定 J2EE解决方案的MIS系统的开发,在该工具中,我们完成的工作和贡献重点包括三个方面:提出基于数据驱动的代码生成策略。本文通过对MIS系统中J2EE设计模式的应用进行透彻的分析和讨论,并选择面向对象与关系数据库之间的转换机制作为中间理论基础,研究并设计出一个为代码生成工具数据驱动功能提供支持的O/R代理层。该代理层能够有效地解决传统代码生成工具不能多方面体现MIS系统中各类数据信息之间关系的缺陷。在XML语言的基础上定义了一种新的模板描述语言MyTDL。该语言文法描述直观,利用现有的许多XML编辑工具就可以很清晰的展现其文法结构,验证其有效性,及时地检验文档的语法,避免意外的操作。MyTDL语言语法简洁但功能强大,作为代码生成器的辅助工具,它的开发成本不高,使用也不复杂。设计并实现了代码生成工具CodeGenerator的体系结构,完成了为MIS系统开发实例——数字教务系统提供代码生成功能的模块,并在JBuilder开发环境下实现了与开发环境的集成。在工具CodeGenerator的设计中,我们广泛采用了XML描述语言、模板设计、对象关系映射等理论和关键技术,这些知识的运用和有机结合为工具CodeGenerator功能的扩展打下了良好的基础。工具CodeGenerator的实现虽然仍处于初级阶段,离自动化和智能化还有一定的距离,但在开发面向J2EE应用的插件式代码生成工具方面进行了很有意义的尝试。同时工具CodeGenerator已经投入运用,并为国防科技大学数字化校园系统的开发提供了便利。10.学位论文张卫山基于UML的信息系统重用技术研究2001该论文基于统一建模语言,探讨信息系统的软件重用技术.通过充分利用UML提供的建模机制和描述能力,我们以基于组件的软件工程的思想研究信息系统,探讨信息系统的软件体系结构、设计模式以及基于组件的开发,并且研究了UML的形式化方法.主要的成果包括以下几个方面:1、信息系统软件体系结构;探讨了利用UML进行组件以及体系结构建模与表达.2、UML的形式化;提出了基于B语言的B2F形式化方法.B2F将统一建模语言图形转换为相应的BAMN表达.3、设计模式的描述以及应用;UML可以帮助我们描述设计模式.该文提出了一种模式描述方法--统一描述法UDM,为更好地理解和应用设计模式奠定了基础,并利用UDM描述了broker模式.另外,还研究了基于EJB的设计模式以降低网络负载.4、基于组件的软件工程;首先探讨了CCM和EJB2.0的新技术.为了更好地理解基于组件的软件工程,我们提出了一个更加全面反映组件各方面信息的概念模型.5、原型系统的实现.我们以一个销售管理系统为例,探讨利用该文的思想进行信息系统的开发.本文链接:http://d.g.wanfangdata.com.cn/Thesis_Y1131053.aspx授权使用:上海海事大学(wflshyxy),授权号:d41a0dbd-13d5-4981-ad5d-9e0800fd73a7下载时间:2010年10月7日

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

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

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