《浅论web快速应用开发框架的研究》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
WEB快速应用开发框架的研究重庆大学硕士学位论文学生姓名:秦长春指导教师:邢永康副教授专业:计算机软件与理论学科门类:工学重庆大学计算机学院二OO八年四月 ResearchofWebRapidApplicationDevelopmentFrameworkAThesisSubmittedtoChongqingUniversityinPartialFulfillmentoftheRequirementfortheDegreeofMasterofEngineeringbyQinChangChunSupervisor:AssociateProf.XingYongKangMajor:ComputerSoftwareandTheoryCollegeofComputerofChongqingUniversity,Chongqing,ChinaApril2008 中文摘要摘要随着WEB应用的迅速发展,WEB应用开发中的矛盾也日渐突起,请求响应的无状态、页面的频繁跳转以及复杂的逻辑转换等困扰着众多开发人员,他们开始怀念C/S模式下的快速应用开发(RapidApplicationDevelopment简称RAD)编程环境,希望WEB开发也能自由的拖放可重用的可视化控件来定制自己的界面,并对这些控件进行事件机制编程,开发人员不用再关注页面的跳转,所有的变化只是控件的数量、位置不同而已,其逻辑层清晰可见。为提高WEB开发的效率,需要一些可以继承RAD开发优点的开发框架。为此,本文研究的主要目的是如何在WEB应用下实现RAD并实现一个WEBRAD的开发框架。首先,对传统C/S模式下RAD的进行分析,总结出RAD的常用设计模式和特点,结合WEB应用,分析如何在WEB下实现RAD;然后分析RAD中的控件模型,实现WEB请求响应的无状态到状态管理的研究,建立WEB下控件模型;随后对RAD中重要的事件机制分析,通过事件驱动模型的原理和WEB应用开发的原理,建立WEB开发下的事件机制;最后基于JSF框架上使用Eclipse的插件系统建立WEBRAD的开发框架,通过SWT/JFace和插件扩展点机制构建系统界面和相关插件集模块,再使用GEF图形编辑框架构建页面模型编辑器,使用EMF框架的JET实现部分代码框架的自动生成与管理,最后使用Hibernate开源框架实现数据的持久化。本文的主要特点是:一、分析研究RAD的原理并探讨WEB开发下建立RAD的方法;二、深入研究控件模型和事件驱动模型在WEB中建立的过程;三、使用开源的可扩展插件机制的Eclipse和其它开源的框架建立一个WEB快速应用开发框架。目前,快速开发框架已经能够进行实验性运行且效果良好,达到了预期的学习和实践目的,为进一步的研究奠定了坚实基础。最后对开发框架发展的未来可能会向RAD、开源和可扩展这三个方向发展进行了预测。关键词:快速应用开发,事件机制,Eclipse,框架I 重庆大学硕士学位论文II 英文摘要ABSTRACTWiththerapiddevelopmentofWEBapplications,thecontradictionsintheWEBapplicationdevelopmentprocessesareincreased.Statelessofrequestandresponse,frequentjumppagesandcomplexlogicconversion,etc.aretroublingmanydevelopers,whobegintomisstherapidapplicationdevelopment(RapidApplicationDevelopmentasRAD)programmingenvironmentintheC/Smodel.Moreover,theyhopethatWEBdevelopmentcanprovidevisualcontrolsthatcanbeofreusabledraganddroptocustomizetheirinterface,andthesecontrolscanberealizedevent-drivenprogrammingmodel.Developersdonothavetoconcernpagesofjump.Thechangesareonlyinthenumberofcontrolsandpositionsofcontrols.Thelogicofthesecontrolsisvisibleclearly.InordertoenhanceB/Smodeldevelopmentmoreefficient,somedevelopmentframeworkswhichcouldinheritthemeritsoftheC/Smodeldevelopmentareneededurgently.Therefore,themainpurposeofthispaperishowtorealizeRADWEBapplicationandaWEBRADdevelopmentframework.Firstofall,thetraditionalC/SunderthemodeofRADshouldbeanalyzed,summarizingtheRAD'scommondesignpatternsandcharacteristicsofWEBapplication,analyzinghowtoachieveWEBRAD;Secondly,thecontrolmodelofRADwillbeanalyzed,achievingtheresponseandrequestofWEBstatelesstostatemanagement,theestablishmentofWEBcontrolmodel.Meanwhile,RADexpansionJSFcomponentsareexpandedfortheestablishmentpreparationofRADcontrolslibrary.Thirdly,ananalysisisdonetotheveryimportantevent-driventhroughtheprinciplesofevent-drivenmodelandtheWEBapplicationdevelopmentprinciple.TheeventmechanismundertheWEBdevelopmentmechanismisestablished.Fourthly,basedontheJSFframework,WEBRADdevelopmentframeworkwillbebuiltbyusingtheplug-insystemofEclipse.Thesysteminterfaceandplug-insrelatedmodulewillberealizedbyusingSWT/JFaceandplug-inadd-onpointmechanism.ThenGEFgraphicseditorframeworkwillbeusedtobuildthepagemodeleditor,usingtheEMFframeworkJETtorealizethecodegeneratedautomaticallyandmanagement.Finally,thedatapersistencecanberealizedbyutilizingtheopensourceFrameworkofHibernate.Therearethreemainfeaturesofthispaper.First,analyzingtheprinciplesofRADWEBdevelopmentandexploringtheestablishmentoftheRAD;Second,in-depthstudyIII 重庆大学硕士学位论文controlmodelandtheevent-drivenmodelofhowtocreateaWEBtheprocess;Third,realizingaWEBRADframeworkbasedonopensourceExtensionofthemechanismofEclipseandotheropen-sourceframework.Atpresent,therapiddevelopmentframeworkhasbeenabletoconductexperimentaloperationandperformingwell,achievingtheperspectiveobjectiveofstudyandpracticeandlayingasolidfoundationforfurtherstudy.Finally,thedirectionsofthefutureframeworkdevelopmentareforecasted:RAD,opensourceandscalable.Keywords:RAD,Eventmechanism,Eclipse,FrameworkIV 目录目录中文摘要..........................................................................................................................................I英文摘要.......................................................................................................................................III1绪论......................................................................................................................................11.1本文研究背景及意义...........................................................................................................11.1.1研究背景...................................................................................................................11.1.2研究意义...................................................................................................................21.2本文研究的目的和研究内容...............................................................................................31.2.1本文研究的目的.......................................................................................................31.2.2本文研究的内容.......................................................................................................31.3本文的组织结构...................................................................................................................42WEBRAD分析.................................................................................................................52.1引言.......................................................................................................................................52.2RAD的常用设计模式.........................................................................................................62.2.1资源窗体...................................................................................................................62.2.2数据敏感控件...........................................................................................................62.2.3MVC分层结构.........................................................................................................72.2.4主框架机制...............................................................................................................72.2.5逻辑组件化...............................................................................................................72.2.6自定义事件...............................................................................................................72.3RAD工具的特点.................................................................................................................82.3.1面向对象...................................................................................................................82.3.2可视化控件...............................................................................................................82.3.3事件驱动模型...........................................................................................................82.3.4代码的自动生成.......................................................................................................92.4WEB快速应用开发.............................................................................................................92.4.1C/S与B/S架构........................................................................................................92.4.2WEBRAD分析......................................................................................................133建立WEB控件模型.....................................................................................................173.1控件模型.............................................................................................................................173.1.1控件的三大要素.....................................................................................................173.1.2控件生命周期.........................................................................................................18V 重庆大学硕士学位论文3.2建立WEB控件模型........................................................................................................193.2.1HTTP请求—响应模型..........................................................................................193.2.2WEB开发模型.......................................................................................................203.2.3WEB控件模型.......................................................................................................224建立WEB事件驱动模型..........................................................................................254.1事件机制.............................................................................................................................254.1.1事件驱动概念模型.................................................................................................264.1.2事件驱动的开发模型.............................................................................................284.2建立WEB事件驱动模型................................................................................................314.2.1WEB状态管理.......................................................................................................314.2.2WEB事件模型.......................................................................................................324.2.3WEB事件分类.......................................................................................................355建立WEBRAD开发环境........................................................................................395.1引言.....................................................................................................................................395.1.1Eclipse概述...........................................................................................................395.1.2GEF概述................................................................................................................405.1.3JSF概述..................................................................................................................415.1.4扩充控件库.............................................................................................................425.2系统分析与设计.................................................................................................................465.2.1开发环境功能分析.................................................................................................465.2.2开发环境结构设计.................................................................................................475.2.3开发环境.................................................................................................................485.3建立WEBRAD开发环境................................................................................................495.3.1RAD环境界面的实现...........................................................................................505.3.2页面编辑器的实现.................................................................................................535.3.3数据持久化的实现.................................................................................................625.3.4生成与部署模块的实现.........................................................................................626WEBRAD应用实例....................................................................................................676.1具体实现.............................................................................................................................676.2开发步骤.............................................................................................................................686.2.1建立应用.................................................................................................................686.2.2持久化配置.............................................................................................................686.2.3定制界面.................................................................................................................696.2.4事件开发.................................................................................................................70VI 目录6.2.5部署并运行WEB应用..........................................................................................706.3框架开发环境评价.............................................................................................................717结论与展望.........................................................................................................................737.1研究的成果.........................................................................................................................737.2需进一步完善的问题.........................................................................................................737.3展望.....................................................................................................................................74致谢.......................................................................................................................................75参考文献.......................................................................................................................................77附录.......................................................................................................................................81VII 重庆大学硕士学位论文VIII 1绪论1绪论1.1本文研究背景及意义1.1.1研究背景快速应用开发(RapidApplicationDevelopment简称RAD),是JamesMartin[1]于上世纪80年代中期在DuPont工作时提出了这个概念。RAD是一个线性顺序[2]的软件开发模型,强调极短的开发周期。RAD模型是线性顺序模型的一个―高速‖[3]变种,通过使用可复用构件,采用基于构件的建造方法获得了快速开发。如果正确地理解了需求,且约束了项目范围,利用这种模型使得一个开发组能够在很短[4,5]时间内(如60到90天)创建出功能完善的信息系统,并由此出现了许多优秀的RAD开发工具,如VB、Delphi等开发工具。应用程序开发可分为两大类型:一类是桌面应用程序的开发,也就是C/S(Client/Server的简称,客户/服务器)模式下的开发;一类是WEB应用程序的开发,也就是B/S(Browser/Server的简称,浏览器/服务器)模式下的开发。快速应用开发方法曾经在C/S结构软件开发中风靡一时。这得益于众多RAD开发工具的产生,微软公司的VisualBasic(VB),Sybase公司的PowerBuilder(PB),Borland公司的[6]Delphi等全球许多著名的公司为RAD开发工具做出了重大贡献。如果你用过诸如VB,PB或DEPHI的快速应用开发工具,你会真正感觉到开发应用程序的高效性和便利性,开发人员只需要简单地拖放一些用户界面控件或其它的组件,每个控件或组件都有一些对应的属性和方法,然后对这些控件的动作编写程序,即事件响应过程。使用RAD工具可以快速的所见即所得的使用可视化可重用控件以及事件响应,通过少量的代码甚至不用开发人员写代码(这些代码在后台通过一定的生成机制自动生成)来实现应用程序开发,大大提高了软件开发的效率,有效的减短了开发的周期。在B/S结构下Web应用程序无论是在工作原理还是在开发模式上都与桌面应用程序有很大的区别。从工作原理上讲,在Web应用中用户使用浏览器基于HTTP协议向服务器发送请求,Web服务器接受请求后创建Web应用程序进程或者线程,并将执行结果以标准的HTML/XML文本格式返回给客户端浏览器。在开发模式上,桌面应用程序是基于事件驱动的Windows编程,而Web应用则是基于无状态Web协议的浏览器与服务器的超文本传递。可视化Windows应用程序开发工具在90年代初就已经有较成熟的产品出现,而可视化Web应用程序开发工具最近才出现。正因两者的区别较大,很多桌面应用程序开发人员由于己经适应了开发1 重庆大学硕士学位论文Windows应用程序的可视化开发工具,很难实现编程思路和习惯的改变而转向Web应用程序的开发。[7][8]传统的Web应用程序开发技术例如CGI、ISAPI、服务器端脚本(例如ASP)等都存在诸多缺点。CGI被认为是早期开发Web应用程序的规范,可以使用多种编程语言来开发。对于CGI技术,每个应用程序组件是一个独立的程序。客户端每向服务器发送一个请求,服务器都会创建一个新进程来处理,不同请求之间不能共享资源,极大的浪费了服务器资源。ISAPI技术存在开发和调试困难、稳定性差的缺点。目前被广泛使用的服务器端脚本技术(例如ASP)等,由于是解释执行的脚本语言,运行效率较低。另外,程序代码和控制浏览器显示的HTML混杂在一起,程序的可读性、可维护性差,代码复用比较困难。目前,随着网络化、信息化的快速发展,C/S结构应用逐渐向B/S结构应用转型,那些当年炙手可热的VB,PB,Delphi等RAD开发工具也在慢慢地被人们淡化,而企业及政府的信息化建设如火如荼,互联网络、信息高速公路成为新的经济腾飞点,并且一些大的企业开始从网络中获益。由于B/S结构应用开发的特殊性,基于C/S结构的RAD方法并不适应Web应用系统,人们期待新的WEB应用快速开发的方法,因此如何引入新的开发工具,统一桌面应用程序与Web应用程序开发模式的区别,分离Web应用程序的界面和代码,解决解释执行的效率问题,并且实现Web应用程序的可视化快速开发,是近年来程序开发人员广泛关注的问题。全球的许多公司也将B/S结构的开发方法列入重点研究的对象,Web应用开发的工具也成为全球许多公司开发的重要目标。目前用于网络应用开发的编程语言有两大主流类:一类是以微软的ASP为代[9]表;一类是以SUN公司的JSP为代表。微软的Studio.NET是一个比较好的可视化开发工具,但也只是在界面上拖放下控件,并没有像C/S模式下的RAD开发。以SUN公司JAVA为代表的开源团队虽有一些如Struts、Spring等的开源框架,但都没有实现真正意义上的WEBRAD开发框架,只是从意义上实现MVC的分离,开发人员仍被复杂的逻辑、频繁的跳转所困难,不能全心的投入到业务实现上面,可见在这JSP这个大本营里,基于WEBRAD开发工具不尽如人意,当前在WEB开发中迫切需要一个完全具备C/S模式优点的快速开发框架。1.1.2研究意义随着Internet和Intranet/Extranet的快速增长,Web己经对商业、工业、银行、财政、教育、政府及我们的工作和生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上,电子商务迅速增长,早已超过了国界。范围广泛的、复杂的分布式应用系统正在WEB环境中出现。可以说,人类社会己经进入[10]了―WEB时代‖。如今的WEB应用程序越来越流行,WEB的流行和无所不在,2 1绪论是因为它能提供支持所有类型内容连接的信息发布,容易为最终用户存取。这也不难想象,正如Sun公司总裁Scott所说,“计算机就是网络”,随着互联网技术的发展,知识在世界范围内得到充分地传播。与此同时,WEB应用开发也取得了一定的发展,但当前无论是.NET方面提供了可拖放可视化的快速开发环境,还是在JSP方面提供了诸如STRUTS的MVC模型开发框架,从根本来看,开发人员仍然要面对WEB应用的客户服务端的无状态,复杂的请求跳转及逻辑关系多层转变,解释执行效率低下,这样将难以降低错误的出现几率;难以使开发人员专心于业务逻辑的处理上;难以提高开发的整体效率。如果有能够在WEB下实现C/S模式下RAD开发的种种优点,并且开发出一个针对WEB应用的RAD框架,这必将加快企业级应用开发的速度,从而极大的节省人力物力,并在一定程度上避免了软件开发过程存在着错误积累与放大效应。本论文就是针对WEB应用快速开发框架所做的研究。综上所述,本课题在学术和应用上都有很大的研究意义。1.2本文研究的目的和研究内容1.2.1本文研究的目的本文研究的最终结果将实现WEBRAD框架,此框架是一个以JSF框架为底层架构,采用事件响应机制,提供丰富控件库的WEB下的快速应用开发框架,其目的主要是为了提高WEB下应用程序开发的效率,提高代码的重用性,实现所见即所得的可视化拖放的控件来定制用户界面以及后台相关代码自动生成的编程环境,所有WEB页面的响应都看作一个事件处理过程来回应,使开发人员能像VB那样随心所欲的编写自己的业务逻辑,解决长期以来困扰开发人员在开发WEB应用程序下的种种局限。1.2.2本文研究的内容研究的内容先从快速应用开发入手,分析快速应用开发在C/S模式下的应用机制,以及快速应用开发所具备的条件、遵守的原则等,同时研究WEB开发与C/S模式开发的异同,建立如何在WEB应用中,也就是在B/S模式下实现如C/S模式下快速开发机制的方法。然后逐层研究控件模型原理及WEB应用响应原理进行分析,在WEB无状态下建立实现状态管理控件模型,来实现消息的封装和管理,并将所有页面信息由控件树统一管理,以此来得到相应控件的状态,并给出了如何使用JSF丰富控件库的方法。随后分析事件机制的原理,实现在WEB下控件有状态维持的情况下建立事件驱动模型,实现WEB应用的事件机制。由此,根据前面的分析研究的成果建立一个WEB下快速应用开发框架并用Eclipse的插件机制和一些开源的框架(如GEF、EMF框架)实现此框架,最后对此框架进行相应的3 重庆大学硕士学位论文测试。1.3本文的组织结构本文共分六个章节,具体内容如下:第一章,绪论,从整体上对研究的主题进行阐述,说明研究的背景、意义及国内外的现状,提出一种WEB下快速应用开发框架。第二章,WEB快速应用开发分析,主要是对快速应用开发的常用设计模式以及特点的分析,结合WEB应用程序的特征,分析实现WEB快速应用开发框架。第三章,建立WEB控件模型,分析C/S模式下控件模型,对WEB应用程序响应的底层机制分析,通过代理Servlet实现客户的请求响应状态保持,使用控件树来统一管理控件状态,使用控件生命周期,建立WEB下的控件模型。第四章,建立WEB事件机制分析,以及事件机制的特点的分析,结合上一章的控件模型,在WEB中引入事件机制驱动模型,建立WEB事件驱动机制。第五章,建立快速应用开发框架,本章主要是对快速应用开发、控件模型、事件机制以及JSF框架的用户组件扩展等多种技术的深入研究,经过需求分析、功能建模和设计开发、测试等各个环节,用JSF框架的底层机制,扩充用户控件库,重现表示层,实现控件自由拖放,代码自动生成,事件响应编程的一个所见即得的快速开发框架。并且通过开源软件Eclipse的插件机制对扩展点扩展以及GEF、EMF的扩展建立此WEB快速应用开发框架,使开发人员真正能在像VB那样的环境下实现WEB的快速应用开发。第六章,结论与展望,对本文的研究成果进行总结,分析优势与不足,以及下一步要做的工作,并对WEB下快速应用开发框架进行展望。4 2WEBRAD分析2WEBRAD分析2.1引言快速应用开发(RapidApplicationDevelopment,简写RAD),是一种比传统生命周期法快得多的最新的开发方法论,形成于80年代末与90年代初,由詹姆斯·马丁(JamesMartin)提出。顾名思义,―快速开发‖也就是实现短周期开发。与传统的软件开发方法相比,RAD是一种可将开发周期缩短2-8倍的“革命性”方法。时间、费用、品质是软件开发的三个极为重要的因素,一个优秀的开发方法在这三个方面都应该做得很好。传统的开发方法,往往在改进某一方面的同时,却影响了另一方面,而RAD则以三要素中最容易定量化的―时间‖作为最优先的考虑对象,[11]同时也可使其它各个方面有所改善。[12]RAD起源于所谓的原型工具(Prototypingtools)。利用这类工具,应用开发人员可以快速模拟出一个应用原型,从而使最终用户在真正的设计完成之前就可对该应用进行考察和试验。因此,原型化过程的最终结果就是生成的原型,这些原型简化了实际应用的其他非本质因素,只保留了应用本身的一些核心要素,一旦用户认可原型,开发人员就可以据此较快地开发出在功能上同原型基本相同的真正的应用软件。设计分析改变系统分析系统界面分析改变系统分析界面分析改变原型设计设计改变错误系统设计测试编码设计界面模型代码错误编码代码生成器测试代码代码代码测试集成产品产品a、传统开发方法b、RAD开发方法图2.1RAD与传统的比较Figure2.1CompareRADandTradition5 重庆大学硕士学位论文应该指出,原型工具仅仅只是提供了一个蓝本,对应用开发者来说,原型几乎不可能直接转化为最后的应用,原型完成之后,开发者必须使用真正的程序语言如COBOL、C等建立真正的应用。这样一来,开发者就得进行两次应用开发。为了解决这一问题,RAD工具通过给开发者提供其在建立原型并转化为最后的应用时所需的一切来对原型工具进行了扩充,从而使得RAD工具比原型工具具有明显的优势,这就是RAD工具得以产生并发展的原因。RAD工具可以说是一个很好的应用开发解决方案。与原型法不同,开发者们只需利用RAD工具进行界面设计即可,他们所做的工作只是安排按钮、菜单、数据窗口以及对话框等界面元件,他们关心的是程序做什么而不是怎么做。他们通过不断给用户演示应用、获取用[13]户反馈并不断对应用进行修改来实现应用开发。如图2.1所示。2.2RAD的常用设计模式2.2.1资源窗体资源窗体可以说是一种最简单的归类做法,就是把许多类似功能的控件,集中到一个资源窗体上面。这样不同的模块都可以共享这个资源窗体中的资源。在RAD环境中,Form是真正的容器,因此,资源窗体实际上相当于一个资源对象池和组件池,也类似于面向对象环境中的Environment类。资源窗体本身是不可见的,但是在软件运行的整个过程中始终存在。在运行期间,资源窗体也可以动态地添加和删除控件。资源窗体也可以维护一些全局的变量和状态信息等,为所有的系统和窗体所共享。使用资源窗体最重要的问题和全局变量一样,就是避免任何模块都可以更改其状态。除了主框架的程序代码之外,一切模块对于资源窗体的访问都应该是只读的。因此,类似同步信号量之类的东西不适合放在资源窗体中。2.2.2数据敏感控件开发和定制数据敏感控件显示数据,对于RAD系统的开发也是很重要的。一般的系统分层,总是倾向于进行水平划分,也就是分为展示层、逻辑层和数据层。但是在RAD开发环境中,展示层就是控件的显示,而逻辑往往直接放在和事件相应的函数中。因此在这样的开发环境中,水平分层往往不是非常明确。这时候,可以倾向进行垂直分层,就是建立数据敏感控件。控件加载数据以后,即可访问数据源来完成相应的功能。数据敏感控件直接工作在数据层上,把数据呈现出来,并且进行必要的数据处理。使用数据敏感控件可以快速地进行应用的开发和流程的变更。特别有利于系统的快速开发,可以很好地体现RAD的精髓。此外,使用数据敏感控件便于实现数据驱动,把那些对于数据统一的操作方式抽象和独立出来进行实现。6 2WEBRAD分析2.2.3MVC分层结构标准的使用把系统分为展示层、逻辑层和数据层这样独立的3层的方式来进[14]行系统的设计。每一层完成自己的职责,相互之间使用简单的调用方式关联。除了采用垂直分割的办法以外,水平分割在RAD环境中也是常见的,而3层的方式就是系统层次的水平分割,其实质就是避免界面控件直接处理应用逻辑,从而建立完整的应用逻辑层。即使对于C/S甚至3层计算架构的客户端,虽然整体系统己经是3层,但是在客户端仍然应该保持3层,特别是在拥有本地逻辑和本地数据的时候。2.2.4主框架机制主框架机制就是建立在主窗体的生存周期上的系统功能状态,也就是把整个程序的功能建立在以主窗体为代表的主框架的生存周期上面。在RAD环境中,整个程序的生存周期是在主窗体的基础上展开的。在建立RAD应用程序的时候,需要仔细地设计主框架的状态和处理的流程。通过使用相对固定的主框架,可以方便地进行应用系统功能的组合和扩展。通过换用不同的界面框架和服务模块,应用程序可以快速地满足变化的新的需求。这一点也能够体现出RAD开发快速灵活的特点。2.2.5逻辑组件化RAD开发应该追求应用逻辑的组件化,而与之相对应的是逻辑的对象化和函数化。组件机制是RAD环境的核心,复用、分发和运作的都是组件,因此,RAD典型的特征就是应用逻辑的组件化。在这样的开发环境中,系统的设计和开发被空前地紧密结合在一起。所以,设计的重点和复用的单元都是组件。RAD系统的纵向分割和横向分割都是基于模块化的,而RAD内的模块化应该尽可能地组件化而不仅仅是对象化。这一点是RAD环境和面向对象的环境的一个差别。此外,由于组件归根结底是平等的,没有层次之分。因此,其分层一般体现在组件被包含在不同层面的窗体容器中。比如资源窗体包含的组件一般就会是底层的一些东西,而交互窗体包含的就是显示层的东西,虽然这样的方式不是很严格,但是能够使得应用程序员可以直观地、可视化地看到系统的层次。2.2.6自定义事件基于控件的应用程序使事件机制关联起来,可以更好地实现系统的灵活性,这是使用RAD环境的主要特征。使用自定义的事件,可以帮助开发人员很方便地进行应用程序的扩展。RAD开发环境一般都提供了一个事件的实现机制,使得开发者只需要简单地继承和捕获事件,就可以进行事件驱动程序的开发而无需自行[15]实现复杂的事件机制。RAD开发几乎都是在使用各种控件(一种被特殊约定了交互协议的组件),从7 重庆大学硕士学位论文而可以实现可视化的操控和开发。控件之间的关联和集成是使用事件来实现的,尽量不要频繁地进行控件之间的直接调用,通过自定义事件有利于提高整个系统的扩展性。控件之间松散的耦合可以使得控件更加有效和便于重用,因此,每一个控件都应该有属性、方法、界面和响应的事件。理论上,应该把全部控件之间的交互都变成对于特殊事件的响应,组建完全松散耦合的系统。在开发应用中需要注意的一点是,虽然组件通过响应自定义的和系统的事件进行工作、沟通和协作,但是尽量不要把处理代码直接写在响应事件的函数中。很多RAD程序难于维护就是因为把业务处理代码直接写在了事件响应的方法中。按照系统设计一个原则,完成什么任务和完成任务的时机应该进行分离,在这里,我们又一次看到了分离带给我们的灵活性。业务上的工作,甚至界面上的交互逻辑都应该被封装到专门的方法中,然后在响应事件的方法中进行调用。这种分离可以使得应用逻辑和交互逻辑严格的分开,为系统的修改和维护带来方便。当然为了安全,只应用于本类和本组件的应用逻辑可以声明为―私有‖的,防止外部的调用。原则上,响应事件的方法中只包含对其他方法的调用(包括属性方法,也就是通过使用属性方法修改对象的状态)。2.3RAD工具的特点2.3.1面向对象RAD的第一个特征,就是面向对象,在RAD的产品中都采用了面向对象模式,将所有事件作为一个对象来操作,实现对象的多态、封装、继承。而这些面[16]向对象的语言都立足于现有语言。VisualBasic基于BASIC,Delphi基于Pascal,而VisualAge则基于Smalltalk。2.3.2可视化控件快速应用开发之所以能提高开发速度,在于它提供了丰富的可视化控件库,开发人员可以自由的拖放控件能快速的实现所见即所得的可视化用户界面。Borland的Delphi,IBM的VisualAge,Microsoft的VisualBasic(VB)和Symantec的EnterpriseDeveloper是这种风格的典型代表。它们都为快速构造和组装应用程序提供了高度集成的可视化控件库。2.3.3事件驱动模型[17]所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数),当然事件不局限于用户的操作,还包括自身控件的变化响应等。构建一个包含事件驱动构架的应用程序和系统,这就使得这些应用程序和系统响应更灵敏,因为事件驱动的系统更适合应用在不可预知的和异步的环境里。这就有效的增强了应用程序的开发效率。8 2WEBRAD分析2.3.4代码的自动生成快速应用开发工具的又一大特点是代码的自动生成,当进行控件的拖放时,不用去考虑如何用代码来生成控件以及控件的相关属性,如位置、大小、颜色等[18]这些相关的代码由IDE自动生成,另外诸如对事件的编程,配置的管理等,基本的框架代码也由IDE自动生成,这大大的减少程序员的工作量,减少编程出错的机率。2.4WEB快速应用开发WEB下应用程序的开发与传统桌面应用程序的开发有一定不同,传统应用程序是基于C/S架构的,而WEB应用程序是基于B/S架构的。下面将对这两种架构进行分析。2.4.1C/S与B/S架构①什么是C/S结构。[19]C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高,效率低。②什么是B/S结构。[20]B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet9 重庆大学硕士学位论文模式下数据库应用,相对易于把握且成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN,WAN,Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。②C/S和B/S之比较C/S和B/S是当今世界开发模式技术架构的两大主流技术。C/S是美国Borland公司最早研发,B/S是美国微软公司研发。目前,这两项技术已被世界各国所掌握,国内公司以C/S和B/S技术开发出产品也很多。这两种技术都有自己一定的市场份额和客户群,各家企业都说自己的管理软件架构技术功能强大、先进、方便,都能举出各自的客户群体,都有一大群文人墨客为自己摇旗呐喊,广告满天飞,可谓仁者见仁,智者见智。1)C/S架构软件的优势与劣势a.应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。b.数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是―透明‖的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常―瘦小‖,麻烦的事情都交给了服务器和网络。在C/S体系下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。c.C/S架构的劣势是高昂的维护成本且投资大。首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正―统一‖,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立―实时‖10 2WEBRAD分析的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。2)B/S架构软件的优势与劣势a.维护和升级方式简单。目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越―瘦‖,而服务器越来越―胖‖是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是―瘦‖客户机,―胖‖服务器。b.成本降低,选择更多。大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用哪种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使得最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。比如说很多人每天上―网易‖网,只要安装了浏览器就可以了,并不需要了解―网易‖的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。c.应用服务器运行数据负荷较重。由于B/S架构软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发11 重庆大学硕士学位论文生服务器―崩溃‖等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。3)C/S与B/S区别Client/Server是建立在局域网的基础上的,Browser/Server是建立在广域网的基础上的。a.硬件环境不同C/S一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务器提供连接和数据交换服务。B/S建立在广域网之上的,不必是专门的网络硬件环境,例如电话上网,租用设备,信息自己管理,有比C/S更强的适应范围,一般只要有操作系统和浏览器就行。b.对安全要求不同C/S一般面向相对固定的用户群,对信息安全的控制能力很强。一般高度机密的信息系统采用C/S结构适宜,可以通过B/S发布部分可公开信息。B/S建立在广域网之上,对安全的控制能力相对弱,面向是不可知的用户群。c.对程序架构不同C/S程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。B/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上。比C/S有更高的要求,B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000Exchange2000等,全面支持网络的构件搭建的系统。SUN和IBM推的JavaBean构件技术等,使B/S更加成熟。d.软件重用不同C/S程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好。B/S对的多重结构,要求构件相对独立的功能。能够相对较好的重用。就如买来的餐桌可以再利用,而不是做在墙上的石头桌子。e.系统维护不同系统维护是软件生存周期中,开销大,相当重要的一部分。C/S程序由于整体性,必须整体考察,处理出现的问题以及系统升级难,可能是再做一个全新的系统。B/S构件组成方面构件个别的更换,实现系统的无缝升级。系统维护开销减到最小,用户从网上自己下载安装就可以实现升级。f.处理问题不同12 2WEBRAD分析C/S程序可以处理用户面固定,并且在相同区域,安全要求高的需求,与操作系统相关,应该都是相同的系统。B/S建立在广域网上,面向不同的用户群,分散地域,这是C/S无法做到的,与操作系统平台关系最小。g.用户接口不同C/S多是建立在Window平台上,表现方法有限,对程序员普遍要求较高。B/S建立在浏览器上,有更加丰富和生动的表现方式与用户交流,并且大部分难度减低,降低开发成本。h.信息流不同C/S程序一般是典型的中央集权的机械式处理,交互性相对低。B/S信息流向可变化,B-B、B-C、B-G等信息流向的变化,更象交易中心2.4.2WEBRAD分析在WEB开发中,由于它本身的独特性实现快速应用开发还存在一定的问题。在WEB应用中,目前来说动态构建页面分为两个大的派别,一个是以微软为代表的ASP,一个是以SUN公司为代表的JSP。ASP使用的编程语言是VBScript之类的脚本语言,JSP则是JAVA,这是两者之间最明显的区别。两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在ASP下,VBScript代码被ASP引擎解释并执行;在JSP下,代码被编译成Servlet并由Java虚拟机执行。这种编译操作只在对JSP页面的第一次请求时发生,后期请求将直接调用编译好的文件。由于Java语言的开源性和跨平台性,以及JSP很好地实现了多层结构,特别是得了J2EE的支持,因此得了迅速发展,本文的快速应用开发主要是基于JAVA语言相关的。通过前面对传统模式下的RAD的分析可以知道,要在B/S架构下实现RAD,同样也要具备C/S模式下RAD的特点与功能。框架的概念在WEB应用开发中早已引入,特别各种开源框架将框架的应用更进一步的推广,如STRUS、SPRING等框架,也就是说在WEB应用开发中实现主框架是没太大的困难;再者是对框架内的资源进行管理、监控,这些是任何一个框架应当能实现的最基本的功能;对于统一数据服务、界面层与逻辑层分离同样与WEB应用开发MVC模式的发展相吻合,MVC模式是一种将视图,视图控制,逻辑控制分离的经典开发模式。它成功应用于大量的C/S开发中,大大清晰了开发人员的思路,提高了开发效率。近年来引入到B/S模式下,在这上面已取得了丰富的经验和知识积累,因此RAD的这一设计模式也可以在WEB应用实现。要在WEB下实现RAD最主要的是三个方面:一个是控件模型,一个是事件驱动模型,再一是数据持久化。13 重庆大学硕士学位论文在WEB应用中实现控件模型,可以提高软件的重用率,而WEB应用程序展示在用户面前的是由一些具体的诸如按钮、单选框等组成的页面,只要对些视图进行合理的化分,可以将页面全由控件来构成,而HTML语言也在这方面有了一定粒度的化分,如表单由标签
表示,下拉框由标签表示,因此可将这角色单一,关联比较大作为一个控件。以此在WEB中实现控件模型是可行的。目前已有一些框架实现了部分的控件模型。在RAD中,模块内应当将其控件化,为使提高开发效率应当提供足够丰富的常用的控件,这个我们会在下面章节分析如何实现。事件驱动模型在C/S中是一个比较容易实现的过程,用户每做出的一个动作,都将由事件监听来获取此事件,然后驱动对应的事件做出回应,从而完成用户操作需求。控件模型主要是为事件驱动细粒度的变化提供基础。为实现对控件状态变化的监控,必须清楚知道控件在请求前和响应后的状态。在WEB应用中,整个过程由WEB客户端(即WEB浏览器)和WEB服务器组成,它们之间是通过因特网进行会话的,而这种会话是通过一种叫做HTTP的标准网络传输协议完成的,而HTTP传输协议是―无状态‖协议,服务器对于每一次来自浏览器的请求都当作完全新的用户,服务器并不知道之前用户对页面做了一些什么动作,也就是无记忆的,因此,要在B/S模式下实现控件模型还是有一定的困难,首先要知道用户动作前后的页面的状态,然后将这些状态统一管理起来。为实现页面状态的管理,如常用的Session的管理,可以将请求响应的动作统一由某一类统一管理,然后再根据需求做出相应动作,如使用AgentServlet来作总代理,此类主要是对页面内控件的状态进行管理,生成一个对象实例,此实例放置此次请求前所有控件的状态,包括有多少个控件,控件之间是什么关系以及控件的位置、大小、颜色等属性,等到请求发来时,根据需要对控件做出变更,如改变控件数量,控件位置等,之后将控件的状态放入对象实例,完成响应过程。这样就实现了消息的―有状态‖,正如将这些消息放入一个容器,来监听这些状态的变化。有了前后状态的变化信息事件驱动的可能性就可以实现,也就是当对控件的状态有了监控时,可以对控件相应的变化进行事件响应,如用户点击按钮或用户在文本框内改变了数据内容,均可对此变化进行事件编程,根据控件的前后状态来对控件进行控制,完成请求的响应。数据的持久化是将使用内存中的数据保存到磁盘的操作,同时也包括数据的存储、访问和管理。在传统的模式中,企业级应用系统的开发中都是在业务逻辑层中利用大量的SQL硬编码语句来实现对数据库中数据的存取,业务逻辑中混有数据存取逻辑,代码可维护性和可扩展性差。所以采用增加数据持久层的方法来隔离业务逻辑层和数据库,用于从数据库中存取对象,数据持久层中定义了存取14 2WEBRAD分析对象的接口,业务逻辑开发人员通过这个接口来访问数据库。在这个层中集中了数据库访问的代码,当更换数据库产品时不会影响到上层代码,这样的结构清晰明快。所以说持久层的实现主要是把实体类映射到数据库表,并对实体类对象进行查询、添加、修改、删除等具体操作。目前JDO、Hibernate等框架在数据持久化层做的比较成熟,均实现了ORM(Object-RelationalMapping)即对象-关系映射,实现实体域对象的持久化并封装数据访问的细节,对本文只需要研究如何将这些框架整合到RAD框架中来。15 重庆大学硕士学位论文16 3建立WEB控件模型3建立WEB控件模型3.1控件模型控件在RAD中的应用非常广泛,也之所以有这些丰富的控件才使得快速开发[21]成为可能。控件(Contrl)就是具有用户界面的组件(Component),而组件是指一段经常用到的公共代码,封装在某个单元模块中。控件可以直接通过界面与用户进行交互。如果一个组件具有用户接口或界面,就称之为控件。控件是组件的一个主要样本(并且历史上曾驱动着组件的开发),控件又不仅仅是唯一的一种组件。组件不需要显示任何信息或用户界面。组件可能实现科学计算,收集性能数据,如计算1971年1月1日到现在的毫秒数,抑或是读取布什总统竞选活动保险箱里的美金数。控件的开发方法以面向对象方法为基础,它是界面、属性、方法、事件的一[22]个封装。它实现了部分功能,能够被很好地调用。同时用户通过继承和修改系统控件库所提供的控件,使其拥有新的属性、方法和事件处理,就可以得到自定义控件。RAD工具提供了大量的控件,用于设计用户的界面,程序员可以通过拖放的操作来完成界面的设计工作,这样做不仅减轻了工作量、简化了界面设计过程,而且有效地提高了开发效率及可靠性。3.1.1控件的三大要素①方法控件的方法是该控件可能被要求去执行的动作。不同控件具有不同的方法,例如,在窗体和图片框等控件中,具有Pset、Line、Cls等绘图方法,而对于滚动条、列表框等则不具有绘图方法。如图3.1所示。方法控件属性事件图3.1控件三要素Figure3.1ThreeKeyelementsofControl②事件17 重庆大学硕士学位论文控件的事件是控件对某些动作的响应,事件的触发常用于对自身控件或其它控件的变更过程。例如,在一个控件上单击或双击鼠标,都会引起控件的相应事件作为响应,或者改变本身的状态,或者去操作其它控件的生成、销毁等。③属性控件的属性提供了对控件的描述,这通常是静态的对控件的描述。如对控件的大小、背景色、位置等描述。3.1.2控件生命周期一般来说控件有两种状态,一种是运行态,一种是非运行态。运行态是在程序执行过程中的状态,每个控件在运行时都有一个生命周期,从控件的生成、控件的执行以及到控件的销毁,在这个过程中所有控件的状态由统一的对象来管理维护,什么时候生成控件,什么时候控件执行动作等,这些功能的管理不需要开发人员专门来写代码来维护,而是由RAD开发工具本身来完成,也就是每个应用程序编写的时候底层机制已经实现了对控件的管理。传统下的控件一般是由一个Form来统一管理,记录控件在执行时的状态,如控件的数量、位置、大小等一些相关的属性和方法,并且在事件触发时来通知控件所做的动作。对控件的管理是非常重要的,程序的界面主要是由控件组成,由一个专门的管理对象来管理也符合认识规律,在C/S模式下控件的管理是比较容易实现的,在客户端控件的状态是持久的,只需要对当前的控件进行遍历,记录各个控件的状态。当一个事件被触发时,根据事件的请求判断请求所要执行的动作,对应的去操作界面上的控件,需要生成新的控件就调用控件生成,需要销毁控件时就调用控件的销毁或其它的动作,然后再对界面的控件重新重组,同时记录下各个控件的状态,并监听控件的事件,为下次变化做出准备,这就是控件在运行时的整个过程。如图3.2所示。响应完成控控事更件件件新遍视响控历图应件图3.2控件生命周期Figure3.2LifecycleofControl非运行态是指控件在开发阶段的状态,此状态主要是控件在界面中的所见所得的过程以及控件的布局,当保存设计的界面时要保存各个控件的相关内容,如18 3建立WEB控件模型名称、位置、大小、标识等,以便在下次打开此界面的能重现控件的布局及相当信息。3.2建立WEB控件模型建立WEB控件模型首先要清楚WEB应用程序开发的机制,然后根据WEB开发的特点来设计WEB控件模型,WEB控件模型最大的难度是对控件状态的管理。3.2.1HTTP请求—响应模型[23]HTTP即HypertextTransferProtocol,是Web应用中浏览器与服务器之间用于传送超文本文件的标准协议。从网络协议的角度,HTTP协议是对TCP/IP协议集的扩展,处于TCP/IP层次的应用层。HTTP是基于客户机/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:①客户与服务器建立连接;②客户向服务器提出请求;③服务器接受请求,并根据请求返回相应的文件作为应答;④客户与服务器关闭连接。客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中成千上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率。如图3.3所示HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。HTTP是一种面向对象的协议。允许传送任意类型的数据对象。它通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送。当用户在一个HTML文档中定义了一个超文本链后,浏览器将通过TCP/IP协议与指定的服务器建立连接。从技术上讲是客户在一个特定的TCP端口(端口号一般为80)上打开一个套接字。如果服务器一直在这个周知的端口下监听连接,则该连接便会建立起来。然后客户通过该连接发送一个包含请求方法的请求块。HTTP规范定义了7种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是GET和POST。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接;从具体用户来讲客户端是使用浏览器,向网络上的一个服务器发出HTTP请求。这个请求与服务器的位置信息一起由统一资源定位符(UniversalResourceLocation,URL)来标志,服务器分析达到19 重庆大学硕士学位论文的信息,然后向用户端浏览器返回一个响应,这个响应可以是普通的HTML文件,多媒体的图片、声音或视频文件,也可以是JavaApplets等任何可以被客户端识别并显示的内容。一些特殊的URL地址会使服务器调用特殊的服务器端程序,使服务器生成动态的响应,一般是生成HTML文件。这是所有Web应用程序工作的基本原理。建立连接发出请求信息发出响应信息关闭连接客户机服务器图3.3Http请求-响应模式Figure3.3HttpRequest-Responsemodel3.2.2WEB开发模型在网络发展初期,在Web上发布的页面都是静态页面,不需要动态生成页面,用户也还没有提出访问数据库的要求。那时的Web应用程序是建立在两层的网络逻辑模型之上的。即网络的层次中只有客户端浏览器和Web服务器,如图3.4所示。FirstLayer客户端SecondLayer服务器图3.4两层开发模型Figure3.4Twotiersdevelopmentmodel此时的浏览器通过URL定位己知的地址发送请求,该Web服务器接收客户端的请求,将客户端所要求的页面作为响应页面,直接传递给客户端浏览器,即完成了响应过程。20 3建立WEB控件模型目前的Web应用大多都是基于用户的需要产生动态页面,服务器端多有数据库的存在,在响应过程中常常需要操作数据库。Web开发的逻辑结构以多层为主。这时的应用程序被划分为可在不同的软硬件平台上多计算机上运行的多重组件。应用程序组件被赋予给不同的逻辑层。逻辑层的划分是按照不同部分所行使的功能来划分的,每个相对独立的功能被划分为一个逻辑层。逻辑层和物理层不一定具有直接的一一对应关系。例如,在不同的逻辑层行使功能的应用程序可能都运行在同一个物理层以内。除了Web服务器。许多应用系统还使用了应用服务器。用户通过浏览器访问Web服务器,然后Web服务器触发应用服务器,使之来处理客户端请求,并把应用服务器的处理结果返回给浏览器。图3.5表示了目前Web应用系统的逻辑层的划分,采用多层结构的请求—响应模型。BrowseApplicationClientWebServerWebServerBusinessBusinessObject/componeObject/componeApplicationDatabaseDataServer图3.5多层开发模型Figure3.5Multi-tiersdevelopmentmodel第一层是客户端Web浏览器。浏览器与Web服务器通过HTTP协议进行通信。浏览器通过HTTP协议向Web服务器发送文档请求,Web服务器将HTML或者XML文本返回给客户端浏览器。第二层是Web服务器。Web服务器接受用户的请求并进行分析。如果用户是请求的是静态的HTML文本则服务器将直接HTML文件返回给浏览器。如果用户请求的是动态的信息则根据需要进行处理,或者将请求交给applicationserver进行处理,之后将处理结果以HTML,XML文件形式返回给用户。第三层位于Web服务器和企业数据资源层之间,负责处理应用系统的事务逻辑。具体执行数据处理、业务逻辑的对象和组件等处在本层。该层的存在防止了21 重庆大学硕士学位论文客户层对数据存储层的直接访问,大大地增强了整个系统的安全性。本层是Web开发模型的核心层,传统的Web应用程序使用以通用网关接口(CGI)为基础的开发技术,但是以新的Web应用程序开发技术如ASP.NET等更加高效、快捷,正在越来越多的为人们所使用。第四层,或者称为数据层包含应用系统的数据资源。在Web应用系统中本层包括数据库和事物处理监控器,负责数据的存储并对存取过程进行管理,对它的[24]存取是由第三层来控制的。层与层的区分完全是出于逻辑上的需要,它们之间并不是有着极为严格的区分界限,这几层既可以分别运行于几台不同的机器上,也可以运行于两台或同一台机器上。分层的目的是使系统的结构更清晰,在进行软件的开发时的逻辑更清楚,分工更明确。3.2.3WEB控件模型由上面介绍可知,在B/S模式下建立WEB控件模型必须对控件的状态进行维护,也就是服务器常用一种―状态管理‖,如Session的管理。因为每一请求和响应都是无状态的,也就是说执行一次操作程序对这些控件是无记忆的,为了维护住控件的状态,须对上一次的控件状态进行保持,待下一次请求出现,可以根据相应的动作对上一次的控件变更。为此可在服务器端设立总代理(如使用AgentServlet代理),此代理将所有的请求和响应代理,然后转交控制权给控件生命周期,同时生一个控制的管理控件的实例,控件生命周期开始对控件进行管理,进入控件生命周期和其它信息进行监控,这也是WEB中常用的一种模式。如图3.6所示:响应BrowserAgentServlet请求生成实例转交后台处理控制管理控件权例实理管控件生命周期图3.6WEB控件模型Figure3.6WEBControlModel在此模型下,控件的状态可以维持住,也就是一旦启动WEB应用程序,服务器端就生成一个管理控件的对象,将此次控件的状态及相关信息放入管理控件的对象中,根据需要对控件进行操作,下一次请求来之前,控件的状态是可见的,不是无状态的,这就可以根据请求的内容对控件进行变更,也就控制了控件的产生、运行、销毁的过程,管理了控件的生命周期。由于WEB应用的特殊性,展现在客户面前的是以HTML语言为载体的页面,22 3建立WEB控件模型而其它动态的网页最终也是以HTML为载体,而HTML语言是一种很有层次的语言,因此相应的控件(如按钮、单选框等)也有很强的层次性,因此可以对所有的控件进行层次性管理,层次性管理使用树结构最为便捷。为此可在管理控件的对象中生成一个控件树,每一次请求响应,先对页面内的控件进行遍历,根据控件的相互关系生成控件树,有嵌套的控件则有子树,然后检查每个控件,是否有事件请求,然后执行相应的事件,最后更新这些控件,将请求后的响应发回客户端,这个过程统一由控件生命周期对控件树进行管理。通过重建这棵控件树来开始控件生命周期的处理过程,使用URI的路径信息部分对控件树标识,此标识符在整个应用范围里是唯一的。控件树中的控件通常由两种基本类型的控件组成:容器控件和基本控件。容器控件可以在其内部嵌套任意数目的控件,而基本控件则不行。使用这两种简单的控件类型,开发者可以建立更大控件,而后者又能被组合到更大、更复杂的控件中。这种控件层次结构允许创建多姿多彩的用户界面[25]成为可能。使用整体-部分的控件层次可使用Composite模式实现,该模式通过一个公共接口,允许对这些控件类型一视同仁,意在组成任意复杂度的整体-部分控件层次结构,同时将单个控件或复合控件视为统一的接口。可以建一个抽象控件类AbstractControl,此类有add、remove、getChild等方法,单个和复合控件继承它。如图3.7所示。图3.7Composite模式的结构Figure3.7StructureofCompositeModel在此模式下,可以实现控件的嵌套,抽象类定义的所有控件的公共接口,它还实现了这个公共接口,以提供默认的行为,其中部分行为用来访问和管理嵌套控件等。23 重庆大学硕士学位论文24 4建立WEB事件驱动模型4建立WEB事件驱动模型4.1事件机制事件驱动体系架构(Event-DrivenArchitecture,EDA)是一种设计和构建应用的方法,其中事件触发消息在独立的非耦合的模块之间(它们之间不需要知道对方)[26]传递。事件源通常发送消息到中间件或消息代理,订阅者订阅这个消息。因为事件消息使用发布/订阅方式通过消息代理传输,一个事件可以传送给多个需要者。EDA和Web服务体系架构之间的主要区别是:在Web服务体系架构中发布者和需要者只有一对一的关系,而EDA中,事件发布者最终可以传送消息给基于订阅规则在MessageBroker注册的任何数量的消费者。事件驱动的模型如图4.1所示,事件调度程序作为输入设备和应用程序之间的中间媒介。事件调度程序是服务器,而应用程序是客户。事件调度程序将输入设备的输入作为事件,并把它们作入事件消息。一般地,一个应用在一段时间内是活动的,事件调度程序清楚这是哪个应用并能根据事件流去引导它。与鼠标相应用程序A关息事消件件事鼠标事件调度程序应用程序B件关事盘相键盘与键应用程序C图4.1事件驱动模型Figure4.1Event-DrivenModel通用的事件驱动系统如图4.2所示,包括产生未加工事件的事件发生器、服务器或者对事件消息中的未加工事件进行处理和编码的事件调度程序及接收事件的客户端。客户端仅为在特定应用中使用的事件提供执行代码(也叫消息处理程序)。客户为事件0和1提供执行代码,而事件2没有被使用。即事件驱动可能发送了三种类型的事件消息,但客户将执行只感兴趣的事件0和1。另外,客户是一种消极模型,它从事件调度程序接受事件消息,标识事件类型并且将其返回到适当的执行代码中。这使得客户在所有被送的事件消息中处于非智能过程。25 重庆大学硕士学位论文发送事件发生器服务器未加工事件客户端A服务将事件转换成事件序列事件序列event_0event1excute_event_0();event0event_1event1excute_event_1();event1event_2event1do_nothing();event2图4.2通用事件驱动系统Figure4.2UniversalEvent-DrivenSystem4.1.1事件驱动概念模型事件驱动机制是指应用程序按照事件发生的次序随机执行而不是按照编程时就定义好的顺序执行,当某个事件发生时,程序将找到相应的事件处理程序来处[27]理事件。构建一个包含事件驱动构架的应用程序和系统,这就使得这些应用程序和系统响应更灵敏,因为事件驱动的系统更适合应用在不可预知的和异步的环境里。事件驱动系统的基本观点是一个系统对外部的表现可以从它对事件的处理表征出来,概念上的事件驱动系统如图4.3所示。输入输出事件接收器事件处理反馈图4.3事件驱动概念模型Figure4.3Event-DrivenConceptModel实际操作中,为简化事件驱动模式系统的设计、实现和使用,需定义一个接口(或抽象类),让它既代表执行系统,又代表执行系统的容器(管理系统)。在事件驱动模式系统中,定义这个接口的名字为EventSystem,已声明了一些与事件驱动相关的操作,例如EventProcess(事件处理器)。同时也声明了所有的管理系统共享的一些操作,例如EventDistribute(事件分发器)和EventCollect(事件收集器)。其结构用UML类图描述如图4.4所示。26 4建立WEB事件驱动模型图4.4事件驱动类图Figure4.4ClassofEvent-Driven在分布式系统中,事件是异步非耦合的,这是系统实时性的要求。因为在分布式系统中,往往各个关键应用既是服务器应用,也是客户端应用,相互之间从功能上看是对等关系,如果在同步情况下,一个应用驱动了另一个应用的事件,这个应用则必须堵塞,以等待事件执行的返回状态,这样这个应用在这段时间内则不能处理实时事件。而各个应用之间相互不完全依赖的情况也决定了分布式系统中事件的两端必须为非耦合的。事件驱动的开发模型包括如下几个部分:①事件定义库该库定义了应用所有认知的事件描述,基本信息包括事件标识,事件特征,事件处理例程,事件所属软件包等。②事件检测模块该模块负责处理事件的收集和分发,当接收事件后,分析事件的类型、特征,然后做出相应的处理,该模块是开发模型的核心。③事件执行模块该模块负责获知事件入口,解码事件携带数据,正确执行相应事件。事件执行模块可以支持事件的持久性,持久性事件的接收方如果中间停止,而在再次启动后仍可以接收事件。④事件信道事件信道是分布式应用之间事件流动的通道。事件信道是单向的,适应分布式应用的多样性要求,事件信道存在多种类型,主要有:27 重庆大学硕士学位论文1)永久可靠的信道。应用之间具有频繁的事件往来或固定的周期性的关键事件要采用这类信道。2)一次性可靠信道。事件的收发具有偶然性,非经常性,但是事件不可丢失。3)广播数据报不可靠信道。信道上的事件是一对多的关系,可以容忍偶然的数据报丢失或失序,如某一些关键应用的指示存在的事件可采用该类信道。4)单播数据报信道5)数据报可靠信道。这类信道主要适应于一对多的可靠事件,该信道在不可靠数据报基础上增加了数据报序列号和事件重发请求,以便形成可靠的事件通道。事件通道为分布式应用提高运行效率提供了基础设施。⑤事件输入源事件输入源是驱动事件的源应用。包括了事件数据的编码和封装,编码是为了使得事件可以在不同的系统平台上流动,封装的事件数据中,头部信息固定的为公共可以识别的信息。⑥提供事件驱动应用APIAPI包括了事件的注册API,以及实现以上各功能的各类API.。事件的注册过程实际上是定义事件信息,将信息写入事件定义库的过程。API要求简单明了,为快速构建分布式应用提供支持。4.1.2事件驱动的开发模型①事件驱动模型的组成[28]事件驱动模型的组成如图4.5所示。Subscriber(register)PublisherSubscriber(DataSource)(EventSink)FireEvent创建t)(epcccreaate()收接EventData图4.5事件驱动模型组成Figure4.5MakeupofEvent-DrivenModel28 4建立WEB事件驱动模型Subscriber需事先和Publisher预订要接受其发布的某事件,如图4.6中的al;Publisher在某事件发生以后,必须先生成该事件的相关数据对象,a2.1:然后通过方法调用来通知Subscriber,a2.2:也就是以回调(callback)的方式来通知Subscriber。当然在预订时,并不一定要由Subscriber自身来预订,也可以由另一个对象来帮忙预订。其动态图如图4.6所示。a1register(s):Publishers:Subscribera2.2eventhappened(data)a2.1newdata:EventData图4.6事件驱动动态图Figure4.6DynamicofEvent-Driven②事件一个事件应该包括两个属性:识别事件的名称(eventidentity,和事件的相关的数据(eventdata)。在Java的编码模式当中,回调可以使用接口模式,也就是publisher必需事先定义好一个在发布事件中使用的接口,subscriber实现该接口中的方法,publisher则通过调用接口中的方法来完成发布事件的式作。如图4.7所示。事件源事件监听者(EventSource)发布事件(EventListener)(fireevent)事件监听接口(EventListenerInterface)图4.7事件驱动回调接口模式Figure4.7InvokeinterfaceofEvent-Driven在Java的编码模式中,一个事件的识别名称就是接口名称和其中的方法名称,而事件数据则为接口方法的参数。例如:publicinterfaceKeyListenerextendsEventListener{publicvoidkeyTyped(KeyEvente);publicvoidkeyPressed(KeyEvente);29 重庆大学硕士学位论文publicvoidkeyReleased(KeyEvente);}由于一个接口中可以包含多个方法,所以Java在设计事件的时候,是将一组相关联的事件放在一起,这样设计的优点是可以很好的将事件做分类,并且在publisher中如果要处理的事件较多的话,可以使用比较少的成员变量来记录subscribers。③事件的预订和发布Publisher必需能够接受多个subscribers的预订,所以在publisher当中必需维护预订者的列表以供将来发布事件使用。在Java语言的模式中,并没有提供特别的东西来帮助这件事,可以自己用collection类来做,例如可以使用ArrayList对象来做记录。Java的预订方法名的风格为addXXXListener(),因为在publisher端必需把subscriber对象―添加‖到预订者列表后面。对于subscriber来说,预订动作的内部处理是黑箱的,subscriber不用关心publisher是如何做预订记录的。参考如下代码段:classPublisher{privateArrayListlistenerList=newArrayList();publicvoidaddKeyListener(KeyListenerI){listenerList.add(I);}publicvoidfireKeyPressedEvent(intkeyCode){Iteratoriter=IistenerList.iterator();while(iter.hasNext()){KeyListenerI=(KeyListener)iter.next();I.keyPressed(keyCode);}}}④事件数据事件发布中被传递的―事件数据‖是事件模型中的重要角色。一个subscriber在接受同一种事件的时候,可能来自不同的publisher,所以希望知道发出事件的人是谁,也就是在传递的参数当中,必需包含一个publisher对象的引用。在Java中,推荐所有的事件数据类都继承java.util.EventObject类。因为在生成一个EventObject对象的时候,必须给一个eventsource对象作为参数。然后可以通过EventObject的getSource()方法来取得这个对象。在EventObject里面,并没有包含其他任何事30 4建立WEB事件驱动模型件数据,所以如果在事件的传递过程当中,任何事件数据需要传递,就必须从EventObject派生出一个新的子类出来。如图4.8所示。KeyEventHandlerDelegate增加/移除(add/remove)事件发布者事件监听者(EventPublisher)发布事件(fireevent)(EventListener)图4.8事件数据Figure4.8EventData4.2建立WEB事件驱动模型4.2.1WEB状态管理在以前的JAVAWEB应用的开发模式中,一般采用的是Request-Response处理机制,即:客户端发送个一个HTTP请求到服务器,服务器收到请求后通过响应方式把结果返回给客户端,用户可以查看返回的结果;如果结果有多页,用户查着别的页面时又发送个请求到服务器端,如此反复地完成客户端与服务器端的交互。由于HTTP传输协议是―无状态‖协议,服务器对于每一次来自浏览器的请求都当作完全新的用户,为了保持状态信息,许多应用服务器都提供―状态管理‖,就是通常所说的Session管理。这样就给最终用户一个无缝集成的假象,好像每次自己的请求都被服务器识别为来自一个特定用户的请求。另外加上HTML本身的特点,利用这些机制来进行事件驱动开发显然是有困难的。这种基于Request-Response处理机制的开发方式和传统RAD开发即桌面应用程序开发方式不同,在桌面应用程序开发中的两个关键技术:控件技术和事件驱动机制,这两个技术是相互关联的,控件只有实现了事件机制,才使得控件更为灵活;而事件机制也只有将控件作为载体,事件才能进行细粒度的化分。将两者结合起来使用才使得开发人员可以通过控件的拖拽、设置属性和编写事件脚本进行快速开发,然而这两个技术是WEB应用开发中长期以来所缺乏的。WEB事件处理和传统C/S下应用程序的事件处理采用不同的方式,在C/S模式下,一切控件的状态信息在程序运行阶段都一直保存在内存中,而B/S模式下的客户端与服务器并不是总是处于连接状态,仅在必要的时候才进行连接通讯。所以为实现对控件状态的保存可以将控件的状态信息保存在服务器或客户端上,在下次的请求中依据这些信息重新构造出控件树和恢复控件状态;另外当客户端表单中有值改变的时候,服务器应该直到包含有该新值的请求发送给它的时候才能―感觉‖到这些变化。如单击一个按钮或一个链接的时候,将产生ActionEvent事31 重庆大学硕士学位论文件,也就产生一次新的请求,可以把这种事件分成两种:仅影响用户界面的事件(比如更新页面控件数)和将调用后端处理逻辑的事件(如更新数据库),对于仅影响用户界面的事件,应该避免对后端处理逻辑代码的调用,对于调用后端处理逻辑的事件,应该等所有请求参数都准备好,才进行触发处理。为了解决以上这此问题,可采用定义请求处理生命周期的方法,请求处理生命周期由系列阶段组成。事件的请求响应转换为控件的请求响应,请求处理生命周期应当包括控件的生命周期,在期间可以对事件的请求进行操作,根据响应的动作去更改控件的生命周期状态,产生或者销毁,也可能是位置、大小发生变化。由此,请求处理生命周期对控件生命周期及相关信息的对象化实现了―状态管理‖,有这些信息的状态就可以在WEB下实现事件机制,事件响应产生的效果可以对当前页面上的控件进行操作,可见―状态管理‖在事件驱动模型上是非常重要的。在上一章已实现了在WEB下控件模型,本章主要是对如何在WEB下实现事件模型。4.2.2WEB事件模型WEB事件也是MVC架构中一个重要方面,本文中RAD框架就是基于MVC[29]架构的,而在MVC中常用处理事件的是Observer模式,该模式是将对象内部状态的改变自动通知给对此感兴趣的相关对象。对用户界面来说,该模式为MVC模式中Model、View和Controller组件之间的相互通信,提供了灵活高效的机制。MVC架构将其组件的表示(View)的数据对象(Model)分隔开来,但表示组件必须依赖于数据对象。一旦数据对象中发生了任何状态的改变,表示组件就应使用正确信息来渲染一个一致的视图。Observer模式描述了对这些看似矛盾的关系的解决方案,这个模式基于两个主要角色:Subject(主题)和Observer(观察者)。主题表示数据对象,可能有任意数目的观察者,后者通过一个一般性接口订阅要接收的状态改变通知。当接收到更改通知时,每个观察者可能会通过这个一般性接口来查询该主题,以便和它的状态同步。Observer模式中有许多组成部分,先概括出每个组成部分的职责,然后解释它们如何相互协作来实现模式目标。如图4.9给出了Observer模式的结构。其中Subject(主题):提供了一个一般性接口来增加和删除观察者,同时向已注册的观察者通知状态的改变。ConcreteSubject(具体主题):实现了Subject接口,并保存了观察者集合,这些观察者已注册要求被通知,它还提供了对其状态的访问。Observer(观察者):为观察者组件提供了一个一般性接口,来接收Subject状态改变的通知。ConcreteObserver(具体观察者):实现了Observer接口,并保存了Subject状态的拷贝。每次Subject通过其Observer接口通知ConcreteObserver状态改变,ConcreteObserver可以查询Subject的新状态。32 4建立WEB事件驱动模型图4.9Observer模式Figure4.9ObserverModel每个想要观察其它控件变化的控件可以通过Subject接口进行注册。实现了该接口的ConcreteSubject管理着那些请求状态改变通知的观察者控件的集合。当状态发生变化时,ConcreteSubject遍历观察者列表,通过Observer接口通知每个观察者。每个被通知的ConcreteObserver可能会再次查询ConcreteSubject来使其状态与后者一致。为实现WEB应用开发下的事件响应机制,事件处理也要遵循Java2事件模型,在这个模型中,任何对象在自身状态改变时都可以通知其他对象。状态改变的信息封装在一个事件对象中。这个模型涉及了3个参与者:事件源,事件对象和事件监听器,总而言之,事件产生时,事件源会生成一个事件对象并将它发送到事件监听器。事件源,是发生状态改变的对象。任何对象都可以是事件源。然而,事件源类必须提供方法来注册或取消注册事件监听器,这些监听器对事件源的状态改变感兴趣,同时,事件源必须维护一个感兴趣的事件监听器列表,如提供addActionListener和removeActionListener方法来增加和删除监听事件。另外,事件源也必须提供逻辑来创建事件对象并将它传递到所有感兴趣的事件监听器中,如下是一个简单事件源程序清单。publicclassMyEventSource{privateArrayListlisteners=newArrayList();……publicvoidaddEventListener(MyEventListenerlistener){33 重庆大学硕士学位论文listeners.add(listener);}publicvoidremoveEventListener(MyEventListenerlistener){listeners.remove(listener);}……}事件对象,封装事件源中的状态改变信息。例如,已改变状态的旧值和新值。事件对象的类必须扩展Java.util.EventObject类。EventObject类的getSourse方法用来返回事件源。在事件对象类中,可以实现相关事件的方法,比如通过相关方法可以得到值改变前后的内容,如getOldValue和getNewValue。现使用一个MyEventObject类来实例事件对象。程序清单如下:publicclassMyEventObjectextendsEventObject(){privateStringoldValue;privateStringnewValue;publicMyEventObject(Objectsource,StringoldValue,StringnewValue){……}……}事件监听器,接收事件源状态改变通知的对象。通过实现的监听器接口来接收特定类型的事件,所有的监听器接口都是Java.util.EventListener接口的子接口,这个接口没有任何方法,并且作为一个标记接口。因此事件监听器接口必须定义一个用来接收相应事件对象的方法。下面程序显示了MyEventListener监听器。publicinterfaceMyEventListenerextendsEventListener{publicvoidhandleEvent(MyEventObjectevent);……}根据WEB应用的特点,常出现两种类型的事件:数值改变(ValueChanged)和动作事件Action。数据改变事件用于观察用户界面控件property的改变(例如展开树节点或者修改文本框中的文字);Action事件则对观察由UICommand派生的用户界面控件(包括按钮和超链接)的激活动作非常有用。所有这些事件类型最终都可从共同祖先Event继承而来。这样WEB事件模型遵循JavaBean的规范,图4.10显示了WEB事件驱动模型中类的关系。从图中可以看出,所有的事件类都是34 4建立WEB事件驱动模型Event的子类,WEB应用支持两种事件:ActionEvent和ValueChangeEvent。对于不同的事件,使用不同的接口处理,ActionListener用来处理ActionEvent的事件,ValueChangeListener用来处理ValueChangeEvent的事件,所以事件监听器类只要实现相应的接口就可以处理不同的事件。Event<此文档下载收益归作者所有