还剩80页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
软件研究所硕士学位论文致谢硕士学位论文基于JavaEE的可复用管理信息系统的设计与实现作者姓名刘焕指导教师:许舒人副研究员软件研究所学位类别:工程硕士学科专业:软件工程培养单位:软件研究所2014年4月DesignandImplementationofReusableManagementInformationSystemBasedOnJavaEEByDingLiangADissertationSubmittedtoUniversityofChineseAcademyofSciencesInpartialfulfillmentoftherequirementForthedegreeofMasterofSoftwareEngineeringInstituteofSoftwareChineseAcademyofSciencesApril2014独创性声明本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研究成果尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明签名___________________日期____________________关于论文使用授权的说明本人完全了解软件研究所有关保留、使用学位论文的规定,即软件研究所有权保留送交论文的复印件,允许论文被查阅和借阅;软件研究所可以公布论文的全部或部分内容,可以采用影印、缩印或其它复制手段保存论文(保密的论文在解密后应遵守此规定)签名__________导师签名__________日期__________基于JavaEE的可复用管理信息系统的设计与实现摘要软件复用是一种计算机软件工程方法和理论上个世纪60年代爆发的“软件危机”使得软件设计人员和开发人员明白,开发、维护过量的软件是极其困难的当软件规模不断扩大时,对于已经开发的软件的维护和新开发软件的综合成本尤其难以负担此时,软件复用的思想是解决这一问题的根本方法可复用软件是指为了复用目的而设计的软件可重复使用的软件必须满足一致性和不变性一致性是指软件构件之间和软件系统之间的相似性,它有助于开发复用系统不变性指的是软件在演化过程中具有的相似性,这种相似性体现在架构上或者设计上JavaEE作为sun公司为企业级应用推出的Java版应用平台框架,经过十几年的发展,目前已经基本上成为企业级应用最主要的Web应用开发平台,而逐渐演化成Web开发的标准然而,就算用Java构造一个不复杂的Web应用系统,也需要考虑开发过程中的许多细节,比如界面布局,如何跳转随着平台应用越来越广泛,使用相同框架开发的不同的管理信息系统具有可复用软件的特点,即一致性在管理信息系统开发过程中,如果所有功能都需要从头开始建立,往往会浪费人力,延长开发周期鉴于以上问题,首先,本文在传统的管理信息系统基础上,借助Sitemesh技术,改进框架展现方式,引入框架配置方案,实现可复用管理信息系统的快速原型构造;其次,扩展系统内分类代码的执行逻辑,通过参数化变量的复用方法,动态管理分类代码;最后,采用基于模板的代码自动生成方案,结合模板提取和配置树技术,设计并实现业务代码自动生成算法,并集成到可复用系统里基于以上设计,本文最终采用广泛使用并遵循MVC开发模式的SSH开发框架,设计并实现了一个可复用的管理信息系统,并集成了常见的管理功能对该系统的测试表明,开发者可以通过配置来快速构造原型系统,通过自动生成来产生直接使用的功能模块,接入或使用可复用组件同时,该系统留下了一些模块的接口,具有很高的扩展性关键词软件复用,可复用软件,管理信息系统,SSH架构,代码自动生成软件研究所硕士学位论文摘要DesignandImplementationofReusableManagementInformationSystemBasedOnJavaEEAbstractSoftwarereusehasbecomeamethodortheoryofcomputersoftwareengineering.Thesoftwarecrisiswhichoutbroke1960sinlastcenturymadesoftwaredesigneranddeveloperknowingthatitisverydifficulttodevelopandmaintainoverdosesoftware.It’simpossibletoburdenthecosttodevelopcomingsoftwareandmaintaindevelopedoneswiththecontinuousexpansionofsoftwarescale.Softwarereuseisthebasicmethodtosolvetheseproblems.Reusablesoftwareisthesoftwarewhichisdesignedforreusepurpose.Reusablesoftwaremustmeettwoqualities:ConsistencyandInvariance.Consistencymeansthesimilaritybetweensoftwarememberorsoftwaresystemit’susablefordevelopingreusablesoftware.Invariancemeansthesimilarityalongtheevolutionofthesoftwareitselfthisisgenerallyreflectedonitsframeworkordesign.JavaEEhasbecomethemostpopularwebapplicationdevelopmentplatformonenterpriselevelsofarasthejavaversionwebapplicationdevelopmentplatformwhichispublishedbySunafterdecadesdevelopmentandithasgraduallyevolvedasthestandardofwebdevelopment.Howeverithasalottoconsiderthedetailssuchashowtojumpatthepagehowtolayouteventoconstructasimplewebapplicationsystem.Differentmanagementinformationsystemdevelopedonsameframeworkhasalotsimilaritieswiththewidelyuseofplatform.Intheprocessofdevelopingmanagementinformationsystemifallfunctionmembershavetobedevelopedfromtheverybeginningitwillwastethehumanresourceanddelaythedevelopmentdate.IntheviewofaboveproblemsfirstwiththeSitemeshtechnologythispaperhasimprovedtheframe’sdisplaymethodintroducedtheconfigurationmethodrealizedtherapidprototypestructureofthereusablesystembasedonthetraditionalmanagementinformationsystem.Secondithasextendedtheexecutablelogicoftheclassificationcodeinthesystemmanagedtheclassificationcodedynamicallybasedonthereusemethodnamedparametricvariable.Atlastwiththemodel-extractiontechnologyandconfigurationtreetechnologyithasdesignedandrealizedthecodeauto-generationalgorithmandintegratedthatintothereusablesystemusingthecodeauto-generationmethodbasedonmodel.BasedonabovedesignthispaperusedtheframeSSHwhichiswidelyusedandfollowedMVCpatterninJavaEEdesignedandimplementedareusablemanagementinformationsystemintegratedsomecommonmanagementfunctions.Plentyoftestonthissystemhasindicatedthatdevelopercanstructuretheprototypesystemviaconfigurationgeneratedcodefordirectoperationviaautogenerationaccessedorusedthereusablecomponent.Furthermorethesystemhasintegratedsomemodular’sapiforthedeveloperandthatmakesthesystemhavestrongexpansibility.Keyword:SoftwareReuseReusablesoftwareManagementInformationSystemSSHFrameCodeAutoGeneration软件研究所硕士学位论文Abstract软件研究所硕士学位论文目录第一章绪论随着信息化时代的到来,软件开发与应用越来越普遍60年代的软件危机使得越来越多的软件设计人员和开发人员明白,开发、维护过量的软件是困难的
[1]在上个世纪70年代的NATO大会上首次提出了软件复用的概念,经过四十多年的发展,软件复用的理念不断被完善,而复用技术也越来越成熟软件复用可以有很多类型,领域内的软件复用可以提高软件的品质,提高软件开发效率,如图1-1所示
[2]:图1-1领域内软件复用的类型从图中可以看出,软件复用包括程序库、设计模式、基于组件的开发、应用框架、遗留系统包、基于服务的系统、应用产品线、垂直配置型应用、程序生成器、面向方面软件开发等为可复用目的而设计的软件如果可以在现有软件设计时便引入软件复用的思想,使用上述几种复用方式,即可减少开发时间,缩短项目周期总体来说,使用可复用系统来构建新需求下的软件,它的意义包括
1、能够降低软件开发的综合成本,提高软件开发的效率用可复用的组件来构造系统还可以提高系统的性能和可靠性,因为可复用组件经过了高度的优化,被专门负责的开发人员进行维护,实现了模块性的分工与合作
2、能够减少系统的维护代价由于使用了可复用的组件,减少了可能的错误,开发人员只需要维护自己开发的模块,而对于复用的组件模块便不再需要检验
3、软件复用能够提高系统间的互操作性和复用性通过使用统一的接口和开发可复用软件规范中留下的扩展点,开发的新系统将更为有效地实现与其他系统之间的互连和复用
4、软件复用能够支持快速原型设计和快速开发过程,实现快速迭代和响应,缩短开发周期利用可复用组件和架构设计可以快速有效地构造出应用程序的原型,以获得用户对系统功能的反馈,以此为循环,进入快速开发和迭代,将会缩短开发周期
5、软件复用还能够减少培训开销开发者使用软件复用的设计方法来构造系统后,不必为新的系统设计和使用投入过多学习精力,而使用一个可复用组件库来构造系统,其中的组件都是他们所熟悉和精通的,便会减少培训的开销使用软件复用的思想来构建新的系统确实能够有效的减少开发周期,但在实际运用中,同时也存在以下问题
[3]使用者或者开发者必须会使用被复用的对象,并且这些对象是可用的而开发者使用这些可复用对象或系统是需要学习成本的需要大量的可复用软件的开发在以往的传统软件的设计和架构中,并没有为可复用性而设计,要将系统重构为可复用的,需要投入新的开发人力,往往这比从头开始构建一个新的不需要复用的系统付出更多,因而项目开发过程中往往由于时间、人力等因素,或者交付项目为主,而不会采用可复用系统缺少基于可复用软件的应用系统构造仅仅凭借实例或者组件库只能为软件复用提供类似于函数库的简单复用,而更高抽象级别的复用需要有理论依据和框架因而,虽然开发可复用系统在短时间内没有实时的效果,使用可复用系统也会产生额外的学习成本
[4],但是从长远来看,开发可复用系统可以有效的帮助团队提高今后项目开发效率,缩短开发周期,节约重复劳动,使得开发工作更加高效由于复用系统的可维护性,使得测试和维护更加简单在可复用系统开发过程中,一方面要尽量使用黑盒并且有明确的接口说明和文档说明,前者的描述使得开发者便于使用,后者的描述确定复用的对象是可用的,另一方面,要在可复用系统中为可复用性扩展留下接口或者扩展点,使得系统具有良好的扩展性
1.1研究背景农产品供应链管理平台,假币管理信息系统等都是基于Struts
2.0+Spring
2.5+Hibernate
3.0(SSH)框架的Web应用,两个系统具有很大的相似性前者旨在为农产品供应链会员(包括供应商、经销商,物流公司等)提供相关农产品信息的管理,后者主要提供假币信息的管理功能两个系统都可以作为管理信息系统的典范进行研究,而找到系统中的相似点,提取公共的功能模块,可以为构建可复用系统提供帮助构建可复用的管理信息系统以便今后在需要实现新的管理信息系统时,可以直接使用可复用系统实现快速原型构建
1.
1.1系统相似点基于SSH框架设计的管理信息系统遵循MVC的开发模式(该技术点在第二章会详细介绍),从横向方向看,系统具有技术性的相似点,从竖直方向看,根据业务逻辑系统具有功能性的相似点横向方向,依据MVC的开发模式,上层是View层界面展示,中层和下层是逻辑跳转在View层,农产品供应链管理平台的登陆界面和管理界面如图1-2和1-3所示图1-2农产品供应链管理平台登录界面示意图图1-3农产品供应链管理平台管理界面示意图管理信息系统首先展现一个登录界面,不同用户登录后,根据所属角色来区分不同的权限功能,登录后展现的管理界面是一个‘匡’字型的框架页,左侧根据角色不同展现不同的功能菜单,页面布局的上方是该系统的名称(或者是含有系统名称的背景图片),下方(未在截图中)显示系统的版权声明或者相关的友情网址链接用户登录到系统后,在当前管理界面的展示页中显示欢迎文字,用户根据具体的需要点击左侧的功能菜单来访问对应的功能功能页面便会显示在右侧的展示页所以整个系统的前端页面应该将框架固定,而只留下右侧的展示页面为变化的,从而避免重复传输页面不变的部分导致网页变慢的情况从竖直方向,系统迁移过程中,管理信息系统具有功能相似性,如管理员的用户管理、系统中的文件接口服务等,管理员登录后管理菜单如图1-4所示图1-4农产品供应链管理平台用户管理示意图系统管理里有用户管理,用户管理展现的是一个用户的列表,还有角色管理,权限管理等,在这些功能的首页,通过一个列表来展现相关业务的基本信息,在列表右侧可以添加,通过列表中的项来操作指定条目的修改、删除、查看等操作管理信息系统从横向和纵向两个角度的相似点如表1-1所示表1-1管理信息系统相似点找到管理信息系统中的相似性,可以为从不可复用的系统转为可复用管理信息系统提供依据越抽象的相似性提取,普适性越广泛,适用领域也更多,适用场景也更加丰富,但同时易用性也越弱
1.
1.2传统管理信息系统缺点以农产品管理信息系统和反假币系统为例,从横向的MVC视角和竖直方向功能视角来分析,传统的不可复用的管理信息系统有以下缺点第一,界面、常量、布局等不可配置每一个管理信息系统的界面都需要从头开始构建,一些页面的公共部分显示需要在每个jsp页面申明,部分固定文字也需要重复书写,如果由于需求变动或者其他原因对相应文字、样式等发生修改,由于不可配置,需要将所有的jsp页面进行修改,重复性的工作既不必要也不符合软件设计的原则第二,系统管理功能不可以复用系统管理功能包括(但不限于)用户登录,用户管理,角色权限管理,文件系统管理,以及在业务代码功能中对文件操作、日志记录功能的代码复用每次新建的管理信息系统,都需要根据该管理信息系统的业务相关来设计对应系统管理模块的表的字段,这个工作是不可忽略的,一般使用工具(如PowerDesigner)可以直接向数据库生成所需要的表,而且便于修改,使系统整体的数据库结构更加利于观察但是,这些功能的页面、控制逻辑等却需要重新开发第三,系统内业务分类代码不可以动态变化在管理信息系统中,需要使用一些与系统业务相关的常量,如币种,农产品类别等这些分类代码作为系统内其他业务的基础,供其他业务引用,在表格中也表现为作为其他表格的外键在传统的不可复用的系统里,当系统上线之后,如果要增加一个分类代码类别(不是某个分类代码的值),只能修改代码,增加新的表,这给维护增加了困难第四,部分相似业务功能代码不可以复用在完成系统架构之后,需要根据需求和业务需要,向系统中添加相关的业务功能模块部分业务功能在逻辑上与界面展示上十分相似,只是字段(根据对应的JavaBean不同或者需求不同)不相同,这些完成相似逻辑的业务代码在传统的不可复用的系统中都需要开发者重新开发由于在团队开发过程中,根据历史经验,往往会在完成一个项目之后,继续开发新的项目,项目之间相关的管理信息系统具有相似性如果采用传统的开发方法,每次项目从需求分析到最终部署,都需要面对上述的问题因而,开发一个可复用的管理信息系统,以便在后期项目中使用,直接开发,可以大大提高软件复用效率,节约开发成本
1.2论文主要工作本文以农产品供应链管理平台和反假币系统为代表,分析传统不可复用管理信息系统的缺点,从不足出发,设计并实现了一个可复用的管理信息系统论文主要有以下几个方面的工作
1、原型系统框架可配置将显示界面的可配置文字写成JavaName常量文件,在页面展现的时候交由界面管理器显示,如系统title,欢迎文字,使得变换系统时只需更换名称文件对应变量的值即可;使用sitemesh技术将管理界面放置在框架页里,嵌入菜单项页面,菜单管理器根据角色权限显示菜单项,实现在不同用户登录状态下动态显示菜单,复用菜单功能;将背景图、样式表等进行分类,编入css文件,由框架页控制,提供若干种input框,按钮等版式,以便在需要更换页面风格的时候修改相应的css类;将每个业务功能的首页展现列表统一用Jmesa开源框架显示,以便统一管理,需要修改表格的背景色,翻页数量,按钮颜色时候直接修改Jmesa配置即可
2、分类代码参数化配置传统分类代码每添加一次就要重新设计对应的表格,生成Javabean,撰写逻辑代码,设计jsp页面,工作量繁琐之外,还需要对上线的系统进行修改,十分不便利用参数化配置的方法,将分类代码配置的功能设计成两级动态,建立开发者视角,在开发者视角下对分类代码元元素进行管理,在系统中,使用同一套管理的执行代码,将分类代码元元素作为一个变量传入对应的执行代码中,并且复用管理分类代码的Jsp页面,使用同一套格式的JavaBean采用该种实现方法后,即使在系统运行过程中,也可以实时添加分类代码
3、业务代码自动生成代码自动生成是系统中最复杂的功能,自动生成的代码兼容现有系统中的逻辑处理方法,遵循SSH框架的设计方式,会生成Xml格式的配置文件,Jsp格式的前端文件和业务处理的Java文件,以及向权限管理中注册一个新的功能Url为了方便操作,将生成系统集成到开发者视角下,开发者在该视角下配置生成表,即可在后台生成对应的文件,放在代码目录中的代码分别由逻辑控制器和界面管理器控制,生成完成之后,只需要在角色管理里将生成的Url分配给管理员,那么系统重启之后,该功能即可上线运转,管理员登录后便可以通过菜单项看到新生成的代码功能,开始使用
4、常见系统管理功能集成系统管理功能在管理员登录系统后,动态从数据库加载管理员角色对应的功能菜单,其中,系统管理功能作为一级菜单,经过菜单管理项配置直接展现在管理员登录后的菜单项里可以直接复用的菜单管理项包括用户管理,角色管理,权限管理,文件系统,日志系统等功能综上所述,本文构建的可复用管理信息系统主要为开发者使用,在开发过程中,缩短开发时间,在系统完成运行之后,除分类代码能动态配置之外,其他功能如果发生改变,仍然需要重新开发
1.3论文组织后续论文章节按如下方式组织第二章首先介绍目前主流的软件复用方法,然后分别介绍JavaEE和SSH架构的特点,最后概括性地介绍了基于模板的代码自动生成的原理第三章对界面框架化进行了设计,对参量化设计分类代码形式和代码自动生成提出了设计方法,并引出了相关的技术要点在此基础上,提出了可复用管理信息系统的整体架构第四章对相关的设计进行了实现,并且详细介绍了核心功能模块的细节第五章对系统进行了验证首先对配置化进行了实验;然后对集成的功能模块都做实验;其次对基于参量化复用方法的分类代码模块进行了实验,确保可以在动态条件下进行管理;最后对代码自动生成进行了实验,确保生成的自动化代码可以运行第六章对全文工作进行了总结,并对进一步的研究提出了展望软件研究所硕士学位论文绪论第二章软件复用综述NASA地球科学数据中心软件复用工作组(下简称WG)与2004年在软件复用相关领域社区和相关人员之间发布了关于促进软件复用技术发展的声明
[5],该声明表示将大力支持NASA软件复用小组人员的沟通,项目合作等WG工作组预期
[6]软件复用带来的好处和潜力包括
1、减少系统开发时间和成本,减低系统开发过程中的昂贵冗余和重复
2、提升系统的兼容性和鲁棒性
3、提升社区参与度,提升开发效率由此可见,软件复用的重要性越来越明显本章将从软件复用的常用方法入手,首先介绍软件复用的几个层面,并对相关技术进行展开,其次对JavaEE框架下的复用机制进行介绍,最后对自动生成技术进行介绍
2.1软件复用方法总体来说,构建可复用的JavaEE管理信息系统,解决管理信息系统遇到的若干问题,可以从以下几个方面考虑一是语言层面,由于系统的开发语言是Java,可以利用Java面向对象的特点,做语言功能性复用;二是组件层面,应用系统在组件的逻辑功能上具有相似性,抽象组件的输入输出,用例和公共的功能,系统的框架,登录页和菜单展现等,实现一个可复用的功能组件;三是系统层面,从业务上来说,同一个应用系统的不同业务模块内部,往往具有相似的模型和逻辑结构,抽象并模型化业务模块,通过自动生成的方式来快速部署业务模块的代码,可以大大缩减开发周期和开发者负担
2.
1.1Java语言复用技术Java语言是面向对象的高级程序语言,面向对象程序设计可以遵循最基础的功能复用,功能复用的含义是,通过特定的方法复用部件、代码、函数、类的实现功能函数,jdk本身提供一些函数的复用,封装在包java.util.function里
[7]函数将基本的功能封装,执行一段基本的功能代码,向外开发接口供其他模块调用并返回执行结果,其他代码模块可以向函数传递参数,调用函数来实现一段功能,如计算两个数的和,比较大小等如果这个功能在多处使用到,那么这段代码便实现了复用的目的继承,Java语言是面向对象的,面向对象的语言允许类从另一个类继承
[8],并且可以使用继承类的方法、变量等,继承使得被继承类的方法和变量被继承类使用,实现了复用的目的参数化类型,参数化类型指定编译器可以自动定制作用于特定类型上的类,虽然在Java里所有的类型都是继承于基础类——Object类的,但是通过定义参数化类型,可以在对象进行类型强制转化的时候,自由吐纳指定的类型,如ArrayListShapelist=newArrayListShape:其中通过一对尖括号来表示定制类型,这样,通过list传递的类型被指定为Shape在复用技术上,可以通过参数化类型定义不同的功能,通过传递功能代表参数所指定的功能模块或数据域,来调用不同业务模式下的执行代码Java反射,反射机制涉及两部分的内容
[9]元层和基层,元层用于描述类或组件本身,而基层用于定义应用逻辑,使用元对象来实现反射机制允许程序在运行时改变程序内的结构或者变量,因而可以在程序具体运行并使用到一个特定类的时候,由Java去临时找到对应类的构造函数进行构造,构造其实体对象,对其初始化在Java平台中,提供了Java.lang.reflect包在可复用系统中,通过对几个同类略有差异的功能实现几个不同的类(或者同种接口下的不同实现),通过使用反射机制,让系统实现动态加载Java语言是项目的开发语言,因而其复用思想(虽然已经是Java语言的基础)是构建可复用系统的基础,合理的利用Java语言的特点可以有效的避免冗余代码的存在
2.
1.2面向对象的组件复用技术面向对象的软件复用中,有两个主要方向,一个是组件直接使用,另一个是基于数据驱动的,十分适合JavaWeb工程,因为Web工程本身就有数据库组件直接复用要求程序系统必须具有模块化的结构
[10],只有在模块化的结构中,模块内部的修改和局部系统的重构才会不影响系统的总体面貌;系统不依赖于具体的运行环境,这样的系统功能可复用性才可以跨平台而Java通过jdk编译后的字节码运行,是跨平台的,因此十分适合最后,如果系统进行数据库操作,那么系统必须建立统一标准的数据界面,这样不会因为数据不同而使用不同的界面,复用性的功能模块不会因界面的差异化而不同在面向对象的环境中,直接复用的组件方法有两种复用方式,一是类库
[11]
[12],类库与函数库相似,但二者有区别,包括在继承、封装和派生上都不太一样;另一种是某一特定领域的特定功能,比如微软平台上的Window开发使用的ActiveX标准的Com组件,它使得很多的Window应用可以直接通过Activex组件来实现,比如js使用Activex接口来另存网页,C#和VB来驱动图形显示等功能另一种是Sun公司为在Java平台上开发的JavaBean组件,bean是一个独立的功能集合,本质上是一个类,但它具有独立的功能描述和完整的变量定义基于数据驱动的面向对象复用技术依赖数据库的存在
[13],该复用思想的提出比较老,现今主流方法采用其思想,但是随着语言本身技术的发展,有Java反射等机制的出现,和web工程中大量框架的出现,便逐渐淡化为了本文的完整性还是有必要介绍一下数据驱动将类的属性、类型、函数名等注入数据库,以此来实现动态类修改类的属性值只是操纵数据库条目而已,这种复用思想在JavaWeb工程中得到大量体现,如Hibernate映射机制,该技术会在下一节说明综上所述,面向对象的复用技术或者是提取可复用的功能,按照面向对象的设计方法,封装功能到指定的类库,并采用合适的方法接入到系统中,或者将数据属性参数编入数据库,在程序运行时候,根据数据库数据的变化来动态显示思想提出的比较早,现在在系统设计时候也常常采用,在可复用的管理信息系统中,将会有效的采取这些复用方法
2.
1.3模型驱动的代码自动生成技术通过对CSE和SPL两个软件复用社区的复用方法调研发现
[14],在大规模复用社区里使用的复用方法都依赖CASE(ComputerAidedSoftwareEngineering计算机辅助软件工程,下同)工具,只不过不同的社区使用不同的CASE工具如基于模型驱动的开发方式(Model-drivenDevelopment下简称MDD),和基于模型的体系结构(Model-drivenArchitecture,下简称MDA)复用方法都是在模型层面的代码自动生成方案但是前者社区的注重点在提升工具的易用性,却无法为架构整个系统贡献太多,后者强调平台适用性,而这恰恰是SPL社区的优势,所以,了解MDD开发和MDA开发对构建基于模型驱动的代码自动生成有很大的帮助
2.
1.
3.1MDD技术概览MDD技术旨在通过对业务流程的抽象描述
[15],将业务形式化的描述为一个特定的模型,在该模型下,用特定的模板或者模型代码去拼接,替换不同的变量,最终得到自动代码的过程MDD生成过程取决于一些因素首先,MDD必须基于XML,MOF和UML,这几个标准之上会大大将少MDD自定义格式和标准的复杂性;其次,如果不使用标准,而只是根据需要自己创建的话,将会存在风险,这些风险包括不能支持主流的语言、架构等,封闭的系统造成开发出来的代码也不会有太强的适用性最后,在编译层面,MDD方法操纵的更多的是文本而不是设计,因而对模型的描述文本往往比对系统的整体认识要重要在MOF和UML基础之上,MDD过程普遍采用的方法是基于OntologicalMetamodelExtensionforGenerativeArchitectures(简称OMEGA标准,下同)的,该过程是基于Java语言版本的,在使用上似乎更加接近面向对象的设计思想OMEGA标准流程如图2-1所示
[16]图2-1OMEGA标准流程图将静态的代码模型通过静态代码生成后,作为动态代码的基础类,经过一些动态代码和模式,最后动态的生成目标Java类,这些类就是能够展现业务模式的行为级源码OMEGA扩展了UML表示的流程图中的可执行部分,而且关注在领域内的“向后兼容”策略最为有效的是,流程中的代码模型(无论是静态还是动态的)都有一个对应的元元素,元元素是决定采用或不采用这块代码的变量,而这一点在本文构建可复用管理信息系统中,也将会用到,这个元元素的生成是从学习模板过程中导出的图2-2展示了代码生成的过程图2-2OMEGA流程代码生成过程模型代码中的每一片代码块,经过生成器的拼装,都会生成对应的在逻辑代码中有实际业务运行相关的代码模块,虽然部分代码可能通过元元素的控制没有被采用,但是不排除在其他系统里这个模块是有用的综上所述,MDD生成技术的问题在于程序理解UML文本图的建模意义,生成过程很简单,遵循统一的标准和流程,但同时也是构建可复用管理信息系统的障碍在本文之前,笔者已发表的论文《基于SSH的代码自动生成》里,由于不需要采用Web的方式,基于JavaSWT平台图形化界面可以识别到本地的JavaBean,因而,可以很轻松的跳过这个障碍,用JavaBean来当作一个原子业务模式,直接读取相关的字段、配置信息而在Web系统中,集成后的系统,应该采用开发者视角,却不能读取本地的文件,所以稍作修改,静态代码无法读取,部分配置需要开发者自己配置写入,但这并不会有太大的影响,在第三章系统设计里将会讲述
2.
1.
3.2MDA技术概览MDA技术是MDD技术之上,加入图形化的结果,如经常使用jstudio工具的研究者或学生会使用基于GEF和EMF的开发工具
[17](虽然这两种工具并不常用),使用MDA开发技术,通过图形化界面配置业务的增删改查而直接生成对应的代码,但代码并不可以直接执行,只是能有基本的函数和伪代码以体系结构为中心的软件生成过程目的在于通过自顶向下的方法对系统的组件进行追踪,追踪指的是在体系结构中,模块是可以被记录的,因而在复用过程中,可以很明晰的查找所需要的模块传统的软件过程建模正如瀑布模式一样
[18],从一步到一步,但它有两个缺点一方面随着经验的增长能够构建更健壮的模块,但是对于简化模块,却未能付诸实践,这也是在大部分软件过程中,软件和系统越来越大,占用空间越来越多的原因另一方面,模块追溯在传统过程中根本就没有被用到,被开发的模块沉沦在系统里,谁也不知道去哪里找到这个模块,怎么复用这个模块,想要开发高质量的可复用的软件系统,对模块的追溯就显得更加重要想要对模块有追溯和记录,面向对象的组件复用有一个组件库的复用方法,正如在
2.
1.2节里提到的,但是它有以下缺点一是缺少商业化分析和需求定位,几乎没有对商业组件相容或一致;二是同样缺少错误定位,如果说模块有错误和不完整出现的话,是无法修复的,也很难重新挂到模块相关的记录上,后来的复用者会不停重蹈前面犯下的错误;三是组件之间的关系描述很简陋,想要完全的理解组件模型是否相容是否能一起组合使用,几乎是不可能的在以体系结构为中心的开发方法中,即MDA技术关注并解决以上问题,他的过程
[19]如图2-3所示图2-3MDA以体系结构为中心的开发方法以系统为中心的MDA技术,自顶向下的设计方法,其中,实现部分在最底层,从中间向两边的商业分析过程提供模型,复用层次从分析级开始,明显复用层次是很高的最上层是系统结构验证,需要商业模型的支持和导入后,进入商业模型选择;第二层是需求分析,经过需求模型导入后,进入验证和新需求添加的过程,设计上该过程会反馈回左侧的生成过程;第三层是组件设计,已经有的组件可以直接复用,同时组件需要满足设计模型的规则,最后,完成设计的体系架构再去编码实现中间的追溯过程完整的保存了组件的记录有效的解决了上述在传统软件过程和组件库里提到的问题综上所述,MDD技术和MDA技术都是基于模型驱动的,在提取完成模型之后,对模型的追溯记录都是属于锦上添花的工作
[20]有效的提取模型,理解业务模式,采用更简单的描述模型的方法,都可以为构建可复用的管理信息系统提供技术方法和帮助
2.2JavaEE可复用方案JavaEE,Java平台企业版(JavaPlatformEnterpriseEdition),是Sun公司为企业级应用推出的标准平台
[21]随着Java技术的发展,JavaEE平台得到了迅速的发展,成为Java语言中最活跃的体系之一现如今,JavaEE不仅仅是指一种标准平台,它更多的表达着一种软件架构和设计思想.
2.
2.1快速开发框架快速开发框架的设计旨在提高JavaEE平台开发的效率,一个典型的示例是采用SSH框架(在
2.3节会介绍SSH框架特点和基于该框架的常见复用方法),构建轻量级的架构,强调易用性,以及开发大量的API标准化快速开发框架如图2-4所示
[22]图2-4JavaEE快速开发框架快速开发框架将Struts和Hibernate放在Frame类库之上,并向系统提供模板文件,通过开发向导(实际上有些是接口的说明文件)接入到开发环境中,其中,开发类库遵循分层结构,如图2-5所示图2-5JavaEE快速开发框架类库分层结构遵循MVC开发模式,前端展现的Jsp到中间控制层的Action,Model层即从BaseAction和BaseModel中继承,这也是类库的核心从实现角度来说,快速开发框架不过是为传统开发方法提供了一些可以复用的类库,实现难度并不复杂,从实用角度来说,可以当作一个系统常用功能性接口jar包来使用,但是对业务的理解和模型的建立,快速开发框架是无能为力的
2.3SSH架构简介使用著名的Struts2+Spring
2.5+hibernate
3.0框架来整合Web应用,可以做到松散耦合,让web应用功能在职责上可以清晰的划分开来
[23]表示层、持久层 、业务层和域模块层SSH架构简图如图2-6所示图2-6Struts-Spring-Hibernate架构Struts遵循MVC的设计模式,主要控制逻辑跳转,通过Struts处理器和配置统一调度中间的Spring通过IOC控制来指定对应的响应在何时加载实例化对应的类最后的Hibernate层连接数据库,建立映射文件在数据库和JavaBean之间,Service层可以通过DAO来直接操纵数据库进行增删改查的功能
2.
3.1Struts简介Struts2以WebWork为核心
[24],采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品图2-7显示在struts2的工作原理图图2-7struts2工作原理图一个发起的http请求被struts2拦截后,在请求转发给Action之前,会有一些必要的工作要执行,如过滤,检查登录Session等之后,Struts会根据请求传来的数据,依据xml配置文件中的默认配置,将数据进行类型转换,还会对数据进行校验,这些工作都做完之后,会根据Action代理去调用Action(这里如果系统配置了Spring,往往需要Spring去实例化一个类),交给Action执行的结果传回给Struts,Struts根据指定的结果找到对应的页面,当然也会经过一些处理,如果没有特殊任务的话,最后会进行Http响应,完成一次请求
2.
3.2Spring简介Spring是一个开源框架,它是Struts和Hibernate的桥梁,该框架是一个分层结构,由七个定义好的模块组成Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式,如图2-8所示
[25]图2-8Spring框架的7个模块各个模块可以单独使用,也可以联合起来使用,其中核心容器提供Spring框架的基本功能核心容器的主要组件是 BeanFactory,它是工厂模式的实现BeanFactory 使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开Spring上下文是一个配置文件,向Spring框架提供上下文信息SpringAOP通过配置管理特性,SpringAOP模块直接将面向方面的编程功能集成到了Spring框架中所以,可以很容易地使Spring框架管理的任何对象支持AOPSpringDAO JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息SpringDAO的面向JDBC的异常遵从通用的DAO异常层次结构SpringORM Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQLMap所有这些都遵从Spring的通用事务和DAO异常层次结构SpringWeb模块Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文所以,Spring框架支持与JakartaStruts的集成SpringMVC框架MVC框架是一个全功能的构建Web应用程序的MVC实现通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POIIOC技术(InversionofControl,控制反转技术,下同)的基本概念是不创建对象,但是描述创建它们的方式(在SSH项目里,一般在配置文件中描述),Spring框架中的IOC容器负责将他们联系到一起AOP技术(Aspectorientedprogramming面向方面编程,下同)允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化AOP的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中掌握Spring的IOC机制,有助于理解懒惰式加载的优势,这也是Spring的优势所在
2.
3.3Hibernate简介Hibernate主要完成数据持久化的工作,其高层概览图如图2-9所示
[26]图2-9Hibernate高层概览Hibernate通过属性文件来指定驱动程序,用户名和密码以及数据库名来连接数据库,同时,通过xml-mapping文件来建立数据库表和JavaBean的对应,在运行时候,数据都被表示层持久化对象Hibernate有一整套管理数据库表多对多,一对多,外键等机制,在操作数据方面,虽然速度比直接操作慢一些(确实是因为持久化层会留有
一、二级缓存),但是大大简化了开发者操纵数据表的难度,数据操纵变得更加直观
2.4本章小结本章首先分别介绍了软件复用在代码级别、组件级别、系统设计级别的常见复用方法和技术,接着,指出了本文所依赖的体系JavaEE的可复用方案,并提出了不足以及本文将会改进的地方最后,本文介绍了JavaSSH框架,旨在提出一种适合JavaWeb开发的框架,并最终运用到可复用管理信息系统中软件研究所硕士学位论文软件复用综述第三章可复用管理信息系统总体设计本站主要介绍可复用管理信息系统的设计思路,主要包括三个方面界面统一化、参数化常量类型和代码自动生成首先对界面控制技术Sitemesh、Jmesa进行介绍和分析,以此引出菜单管理器和界面控制器;接着分析参数化分类代码类型,以此引出分类代码生成工具,最后介绍代码生成技术中使用到的配置树和模板生成算法,以此引出业务代码生成工具最后,引出整体的系统架构图在最终的系统中,如
1.2节所述,还会集成一些常见的系统管理功能
3.1设计思路可复用管理信息系统应该考虑到系统使用的对象,系统集成后提供给的视角,包括三种,开发者(用于开发),管理员(使用者)和普通用户(由管理员生成或注册生成),权限控制由管理员决定其次,要针对界面配置方案和自动生成技术做设计,引出技术方法
3.
1.1系统功能分析系统应该提供给开发者部署配置整个系统的功能和向系统中添加复用组件、业务代码的方法,提供给管理员使用集成在系统中的系统管理功能,提供给普通用户使用的业务功能系统用例图如图3-1所示图3-1可复用管理信息系统用例图可复用管理信息包括生成部分和最终运行部分,在图示中左侧是开发者视角下使用的生成部分的功能,用于配置启动可复用系统,并动态的管理复用组件,自动生成业务代码;右侧是管理员视角,系统运行时其他参与者(管理员、系统业务参与者等)使用的功能模块,除业务功能外,管理员拥有对系统集成管理功能的操作权限开发者视角下的功能包括配置框架常量管理,这包括配置名称常量、界面公共元素背景,欢迎字等等,之后系统便可以启动,启动之后,开发者可以使用元元素管理向系统中添加分类代码,也可以使用业务代码生成工具向系统中自动生成业务代码,而组件复用包括两个含义,一方面,系统本身集成了公共的开发接口包如文件系统、日志系统,另一方面系统定义了接入到系统中的复用组件的方法,后续如果有新的开发包也可以接入到系统中,壮大组件库管理员视角集成了常用的系统管理功能,并可以使用从开发者导出的功能和在接口下实现的功能,在权限管理模块里,管理员还可以将一些业务功能模块分配给普通用户普通用户使用的是管理员在权限管理中分配给自己的权限功能不同角色登录后,通过菜单管理器和界面管理的限制,不同用户看到属于自己的功能模块,从而实现分割综上所述,系统的开发视角应该有两个层面,一个是开发部署,开发者使用的功能在使用之后,往往都需要重启系统(相当于再次编译),另一个是运行使用,系统为用户留下登录入口和相应的业务功能
3.
1.2界面配置方法Sitemesh是一个基于Web页面布局、装饰及现行Web框架整合的应用框架
[24],Sitemesh是基于Servelet的,它通过截取Response流,对返回页面进行装饰后再返回给浏览器在于Struts2结合的过程中
[25],通过Filter对页面进行装饰,装饰页面是写在系统里的,Sitemesh根据配置文件找到装饰页面所在,对被装饰页面进行装饰后,最终得到页面布局和外观一致的页面,返回给客户端在Struts中使用Sitemesh,需要在配置文件web.xml中进行配置filterfilter-namesitemesh/filter-namefilter-classcom.opensymphony.sitemesh.webapp.SiteMeshFilter/filter-class/filterfilter-mappingfilter-namesitemesh/filter-nameurl-pattern/*/url-pattern在上述代码中,定义了Sitemesh的Class包,包名也可以看出是Opensymphony开发的,在mapping里,页面过滤模式,/*表示对所有模式匹配的url都进行装饰后输出,当然,如果某些页面不需要被框架装饰,可以在工程的配置文件decorate.xml中指定xmlversion=
1.0encoding=UTF-8decoratorsdefaultdir=/decoratorsexcludespattern/struts/fck/editor/*/patternpattern/images/*/patternpattern/dojo/*/patternpattern/servlet/*/patternpattern*.html/patternpattern/system/showSubMenu!showMenu.action/patternpattern/error.jsp/pattern/excludesdecoratorname=commonFramepage=commonFrame.jsp/decorator/decorators在上面所示的代码中,指明了不经过Sitemesh装饰就直接返回的页面模式,如html后缀的,error.jsp 提示错误的页面等同时,配置中也显示说明了装饰页面所在的路径和名称该装饰页面commonFrame.jsp十分重要,在后续章节里,将会在该装饰页面上进行设计,界面管理器和名称常量都需要在该框架页上实现业务功能模块都需要首页展现,而展现的页面都会将数据进行筛选后,以列表的形式展现在浏览器里,不妨称之为业务功能的首页首页的列表随着数据的增多,必须要分页,而且展现的方法也多种多样,样式也不统一,正如在第二章组件复用里所述,可复用管理信息系统如果涉及到界面,就必须对界面做出统一的约定使用一套统一的界面表现方式有助于开发可复用信息系统,相反,如果界面很多地方不进行约定,那么开发出来的模块展现便会各种各样,根本无法复用Jmesa是基于ExtremeTable扩展而来的强大的Table组件,在Web应用中可以作为输出统一表格制式的工具,核心包org.jmesa.core,其中,接口org.jmesa.view视图展现定义了Csv和Html两种展现方式,展现的原理是一个视图拥有一个被展现的组件和渲染器,使用渲染器来渲染组件在Web应用中,核心包org.jmesa.web为在该环境下使用Jmesa提供一系列的类,在Web应用中使用Jmesa,需要在工程配置文件web.xml中配置!--***********************************--!--*jmesa.properties*--!--***********************************--context-paramparam-namejmesaPreferencesLocation/param-nameparam-valueWEB-INF/jmesa.properties/param-value/context-param!--***********jmesaend******************--在项目中指定使用Jmesa属性的文件目录地址和引用地址,可以在配置文件中显式地改变表格的属性,如分页显示数目,行间距等等项目中需要导入jmesa.jar包,在Action中使用Jmesa,需要导入相应的接口,主要包括展现,表格,视图和表单容器等importorg.jmesa.facade.TableFacade;importorg.jmesa.facade.TableFacadeImpl;importorg.jmesa.util.ItemUtils;importorg.jmesa.view.editor.CellEditor;importorg.jmesa.view.html.component.HtmlColumn;importorg.jmesa.view.html.component.HtmlRow;importorg.jmesa.view.html.component.HtmlTable;最后,综上所述,为了使得界面统一管理,会使用到Sitemesh过滤器、Jmesa表格等工具,同时,在图片,Html元素控制等方面,会使用到Css,但是Css技术非常普遍,便不展开说明在构建可复用管理信息系统中,统一有效且可以配置的界面是十分重要的,有了统一的界面和设计,复用组件适用性才会更广泛,不同的需求下可以配置不同的色彩主题,图片背景,html元素样式等当然,可复用管理信息系统的重点不在解决界面的细节,随着项目的复杂性,往往会请专业的前端工程师来设计
3.
1.3模板生成方法代码自动生成将根据配置将目标代码模板进行拼接
[29],最后进行替换,生成算法由生成器进行,最终生成到代码目录中,但是模板需要从传统管理信息系统中提取,代码包括java,jsp和xml配置等,需要从这些以往的代码中抽象形成可以使用的代码碎片作为模板
[30]从若干个代码文件中提取公共的代码部分,并将其抽象成模板文件,称之为模板生成模板生成首先要考虑如何提取公共的代码部分在各个不同样本中,有些代码片段的逻辑是相同的,将其抽象成一个公共模板;有些代码片段是依据某一个关键字或者变量的,将其抽象成若干个不同的模板碎片,并通过关键字来决定;有些代码片段具有自己的特殊性又不太容易被抽象,将其舍去基于相似结构的片上系统提供了一种基于相似性抽象定义成图
[31]的方法将这些代码片段抽取出来,同理,可以通过图3-2所示的方法来提取JavaJsp、Xml等样本文件中的公共模板,并且导出一些决策性变量图3-2模板生成示例首先定义一个森林F=(NW)来表示输入的样本,其中N是节点集合,W是边集合,从树竖直方向上N节点连接起来表示一个样本,其中每个节点Nij表示一段代码片段,在Nij之间的指向性线段表示到这个语句代码段的条件,这些条件或者是局部变量或者是私有变量然后为这个森林在最开始端加上一个虚拟节点N0,并且在N0指向所有的开始代码段之间加上虚拟条件,不妨称之为any,这样得到一棵树T=F∪G’G’={N0W0i|Nik∈N}上面的公式表示将原来的整个森林和图G’合并之后得到一个更大的图T,而G’表示N0和所有以N0为初始节点的边不妨称T是最终的树,那么按照下面的规则对这棵树做映射操作VTNij=这个映射表示,如果存在i和k使得在某一个水平线上的边线关系相等,那么以这个边结束的节点便认为是一个公共的部分,不论这个代码片段是否具有相似的名称,在这个边关系的决定下,两个代码片段表示的逻辑功能一致,并且他们的先决条件也一致,那么这个代码片段经过抽象,便可以变成一个模板Mj,在图中,如W23=W33,得到了一个合并的模板M3相反,如果对于任意的i,k,都会出现边关系不一致,那么很明显,业务代码在进行到这一步的时候,无论任何条件都不足以将这段代码进行统一的,也就是根据业务的不同,代码种类太多而无法统一,很明显,在复用系统中,这样的代码片段是不可以被使用的,只能舍去,在复用系统中,直接不显示这块功能(确实没有共同点的小模块是无法统一的),开发者可以在生成之后进行修改如图中,由于W24W34设置为NULL,我们定义这一小段代码是私有的,对于私有的代码片段,复用系统不再考虑经过这样的映射,将所有的代码节点映射成可以抽象的模板,如图中右侧的树(准确的说已经不是树了,只是保持了树形的结构)所示在模板导出过程中,如果边条件多样会产生不同的分枝,而分枝条件由下面的公式确定ETWij=ejuMj存在,u为分枝数目这个公式表示,即使有再多的样本输入,只要能抽象出一定的模板Mj,那么(当然,对于小量样本支持的边,也会舍去),产生的分枝数目如果是u个,就需要对这个变量赋值区间就有u,在图示中,M2和M3产生了一次分枝,分枝条件e21和e22便是边的条件,按照上面的公式产生决定这个分枝走向的值可以设置成一个变量,比如e2是一个变量条件,当e2=e21时分枝从左边走,用模板M2来拼接目标代码,反之从右边举例说明,代码中的id是Integer类型的和String类型的会产生不同的get-set代码片段,很明显,需要一个变量idType来表示id的类型,当它赋值为Integer时候,选择Integer对应的代码片段,反之选择String所对应的代码片段当然,随着类型的增加,idType的取值范围也会越多这样导出的变量有些可以从JavaBean里读出来(在本文所涉及到的web工程中,浏览器不能读取本地文件,同时由于时间关系,也不能支持从本地上传文件到服务器端进行扫描查找,所以,配置都是需要在web表单里手动添加),有些通过开发者配置,变量对代码片段的决策关系,将在第四章详述
3.2系统架构基于JavaEE的可复用管理信息系统采用SSH框架设计,前端遵循MVC开发模式,数据库使用Sqlserver,应用服务器Tomcat在进行平台迁移的时候需要更换相应的配置文件,如果更换数据库,需要修改驱动程序即可可复用管理信息系统主要统一界面格式,部分可配置,大部分工作都需要开发者在该复用系统上直接开发,既是生成系统也是最终的部署系统,可复用管理信息系统架构图如图3-3所示图3-3可复用信息管理系架构图可复用管理信息系统不仅包括最终部署系统运行时所需要的Jar包,SSH框架环境,相关配置文件等(不妨称之为目标系统),同时,也集成了开发者视角下的功能模块,这些生成工具、配置工具在使用时,可以直接通过开发者登录后操纵,当然,完成生成后,都需要重新部署系统,其实相当于两个系统融合在了一起图中,橄榄色模块表示可复用的管理信息系统在开发部署时,能够使用的模块,作用主要是为了配置系统的名称常量和向系统中添加功能,蓝色表示系统运行过程中使用的模块,这些功能模块读取相应的配置,在管理员用户登录时可以展现对应的功能红色模块表示配置或者代码存储的地方黑色箭头表示控制流,绿色箭头表示信息流,右侧垂直方向的模块之间有依赖关系
3.
2.1名称管理组件名称管理器为目标系统相关界面(如登录页,框架页、首页等)提供名称的组件目标系统在部署之前,需要进行名称配置,包括目标系统的名称,登陆界面显示的欢迎文字内容,管理界面的条杆的图片地址等等内容名称管理器功能模块如图3-4所示图3-4名称管理器结构名称管理器通过配置相关的配置文件,主要有样式css文件,框架显示相关的jsp文件和java文件,前端经过Decorator集成,后端通过Sitemesh过滤器后,最终在展现给用户的jsp页面得到表达
3.
2.2分类代码元元素管理管理信息系统在构建业务之前,都需要根据业务相关创建相关的分类代码,分类代码是一块十分冗余的结构,常量通过key-value的形式得到表达业务模块如果引用了相关的分类代码,都会在数据库表里对所引用的常量记录相关的key,在展现的时候,显示value即可在传统管理信息系统中,每一个分类代码都需要设计一张表,对应一个管理界面,一份操纵分类代码增删改查的代码在可复用管理信息系统里,通过使用参数化类型的复用方法,将分类代码名称当作一个参数,通过代码控制,自动产生一个管理界面,一份管理其数据的代码,并且将数据统一存放在一张分类代码表里,只需要通过一个名称表管理即可如图3-5所示图3-5分类代码管理工具结构图分类代码元元素管理工具一方面通过向名称表添加一个分类代码名(如币种),同时也向分类代码管理界面添加一个对这个新添加分类代码的管理入口,该入口系统重启后,经过菜单管理器,管理员登录后便可以查看到,进入这个分类代码的管理界面(如币种管理),管理该分类代码下的一些对应的数据,如添加一些币种人民币,美元等数据添加完成之后,存放在分类代码数据表里系统内其他业务功能如果要对分类代码进行引用,直接引用数据表里的数据key即可
3.
3.3业务代码生成工具在可复用管理信息系统中,通过JavaBean原子数据模型下的代码自动生成,向目标系统里自动生成操纵JavaBean的代码,从开发者的视角来说,分析业务需求和功能,构建一张数据库表和使用Hibernate生成其对应的JavaBean,便完成了对业务的分析,之后,在开发者视角下,使用业务代码自动生成工具,填写配置表单,便可以向目标系统中生成操纵JavaBean的代码如图3-6所示图3-6代码自动生成示意图业务代码工具生成的代码包括Struts配置文件和Spring配置文件,都是xml格式的,前端管理界面的jsp页面文件和后端负责业务跳转和数据操作的Java文件由于系统生成遵循同一套规则,所以生成的文件和文件夹及相关配置都放在同一个池中其中,前端页面遵循使用Sitemesh框架页Decorator,后台代码使用标准的增删改查,并且列表使用Jmesa来输出展示写入业务代码文件和配置之后,还会向权限系统里注入一条访问该功能模块的URL,显然,在权限功能里将该功能赋予给任何用户,该用户登录即可访问如果生成了几个不同的业务代码,在自动生成工具的帮助下,业务代码都是相似,而不同的地方都是通过配置树来决定的在构建系统的时候,配置树描述法被广为采纳它的原型是XML文件或者是类html文件,因为可以通过DOM轻松的解析他们如在
[32]中,用配置树的方法来描述DCLITTA框架,该框架是一种将分布在各个不同地域的组件库进行关键字匹配并重装的一个方案在可复用管理信息系统的代码自动生成过程中,其描述性配置文件如图3-7所示图3-7配置树结构输入一张Web表单,从Web表单里拿到的配置会决策两个不同的分枝,一份是写往代码目录下的文件,包括Java(Action业务操纵)和前端展现jsp以及相关配置xml,配置表单会决定这些文件的文件名和存储的目录位置,在本文论述的可复用信息系统里,不同种类的文件都被写往指定的位置方便管理另一份决定生成器工作时候产生过程,其中包括,决定Jmesa表格展现显示列名的展现列表,本文目前暂时最多支持8个展现列,因为更多的展现列被无法容纳在浏览器内而xml生成过程最为简单,只需要actionName即可,通过输入的actionName来替换掉模板中的actionName以此来区分各个不同的action而生成Action代码和Jsp代码还需要相应的DaoName,idName,idType等参数,生成jsp页面仍然需要beanName和返回函数,functionName等变量
3.
3.4业务代码生成过程业务代码自动生成主要是为单业务模型自动生成对应的操作代码,包括界面和跳转以及集成在SSH系统中的配置模块系统结构图如图3-8所示图3-8代码自动生成系统结构图生成模块由模板池、生成器、文件系统和基础服务四个部分构成文件系统可以检查输入文件的可读性,读出的数据是否合法,输出文件路径是否可写,在指定路径生成文件,拷贝文件,检查文件的大小等功能基础类服务被生成器调用,提供诸如用来正则匹配,大小写转换,关键字替换等功能模板池包含了很多的模板,这些模板是经过几十个模板文件经过
3.
1.3节描述的算法学习推导出来的,生成器根据生成算法读出这些模板进行拼接产生目标代码文件和配置文件生成器对action、jsp、xml文件的生成算法很类似,这里以Action的Java代码为例作说明.调用文件服务和基础服务,检查生成路径的文件状态,补偿默认一些没有配置的参数使用默认值;打开写入文件tmp文件的通道,写入头部Model;判断id类型,选择性写入id对应的Model;根据id类型,选择性匹配增删改查的模板并写入;根据查询条件,拼接query模型的模板,并循环写入;写入tmp文件的尾部,关闭流;将tmp作为输出流,经过基础服务的正则匹配解码器,将变量规则加入,将对应的beanName等替换成配置的值,过滤后导出文件为actionName+”action.java”.Jsp生成过程与Java相似,不过拼接的是Jsp代码片段,并且使用在
3.
3.3节所述的配置树Jsp下相关的变量来决定选择的相关模板而xml有一点不同,由于配置文件复写一个文件,因而不能生成一张新的,要向已经存在的xml文件中追加首先使用文件服务模块的拷贝函数从代码目录中拷贝已经存在的xml文件备份,然后向现在的xml中追加相关的配置生成过程中满足以下约定baseAction这个action文件为系统创建,所有的自动生成的javaaction文件必须继承这个action类,该action类中含有获取struts堆栈空间,获取文本和response以及request参数等函数功能id Javabean对象都需要有一个id,这个id是在Hibernate生成时候导出的该id可能是用户自定义的String类型(唯一),也可能是由数据库控制的自增的Integer类型id的名称和类型都需要从web表单中指定,因为不同的id类型会产生不同的get-set方法,而不同的id名称在action中声明时候也不同idType决定内容包括
一、action中toadd方法是否要使用baseService为系统生成一个随机且唯一的String码作为id;
二、传参给service的方法中带有id变量的类型;
三、在校对id是否合法有效时候,使用null判断或者string空判断beanName:beanName在生成代码中经常使用,beanName的参数值在web表单中必须配置,示例在一个JavaBean名为”SampleBean”对应的action中使用申明定义”SampleBeansbean;”那么代码中就可以使用sbean进行操作了展现列表展现列表即最后自动代码运行时候展现在管理页列表里的项,这些项通过Jmesa表格统一格式,并自动加上项operation,构成了功能首页的列表,如一个财务表单有很多信息,但是可能首页显示的列表中只要简要的显示“收账人、出纳日期”这两项,则填写这两项,展现列表将会决定action中对输出往前端页面的表单中,只操作和展现列表规定的项目,表单题目显示为成员变量名(这样是为了减少用的配置负担)自动生成的javaaction文件中,一些使用的局部变量名也是按照规则生成的,开发者可以在代码生成后手动修改,也可以直接使用,这些局部变量包括action内使用的javabean名称由用户填写的表单内JavaBean的beanName变量决定统一对action实体内使用的bean命名为littleBean,littleBean可以存储对应JavaBean相关的信息,用于与前端页面交互,在增加、修改、详情页面等功能,可以直接使用该变量action内使用的与对象id对应的辨别码统一定义为id,idName和idType一起构成了对私有id的声明,如”privateIntegerid”Action内使用的Dao名统一命名为littleDao,最终声明如SampleDAOlittleDao使用littleDao的增加、修改等操作直接操作id或者littleBean对象即可操作相对应的数据
3.
3.5菜单管理组件菜单管理组件为目标系统用户登录后,生成该用户的菜单功能的组件一般而言,管理员用户的菜单里包含默认的功能有系统管理组件,其他的业务功能模块都需要通过菜单管理组件根据配置DB里的数据来动态的生成有些业务模块是通过生成工具生成的,那么功能模块代码就在代码目录下,所以菜单管理组件的菜单项在运行时,要调用代码目录下的代码(有些通过控制器,有些不需要,可直接凭借url里的名字)在目标系统里,设计了用户-角色-功能三级映射的权限管理,如图3-9所示图3-9用户-角色-功能三级映射示意图每个用户都被赋予一个角色,而每个角色可以关联多个功能,功能以url的形式存在,其相关的名称,父亲节点等信息都放在配置DB中保存菜单管理组件的工作机制是,在用户登录时(或发生权限相关的变化时),根据用户对应的角色,找到相关的功能,对功能按照一级菜单和二级菜单排序,将相互关联的菜单项整合到一起,生成一张完整的菜单列表该列表在前台展现时候,通过Sitemesh时由Decorator控制展现,放在框架页的指定位置,从而实现了菜单可配置
3.
3.6其他模块概述其他功能模块包括控制器,界面控制,配置DB,系统管理组件等权限管理组件,为目标系统提供访问新功能的url并分配给相应角色的功能模块如
3.
3.5所述,菜单管理组件读取对应用户的功能列表,展示相应的菜单功能开发者使用权限管理组件可以配置自己开发的功能模块的url和url显示的菜单名称,也可以将分类代码元元素管理工具和业务代码工具生成的代码后产生的url权限分配给相应的角色,保证该角色登录后可以看到对应的功能代码目录,存放业务代码工具和分类代码元元素管理工具生成代码的目录一般来说,生成的代码包括前端显示jsp和业务层javaaction,以及相应的功能配置文件xml,分配存放在不同的目录下配置DB,存放权限管理组件添加的功能相关信息,以及自动代码生成后产生的新功能信息控制器,控制自动生成的代码模块对应的菜单项url点击后,发生响应并找到对应的执行代码控制器主要有两个功能,一个是url点击后,找到对应前端显示代码,通过界面部件正确的展现;另一方面,当发生业务模块的业务操作时,比如增加该业务下的数据,控制器找到对应的Java代码去处理相应的Http请求系统管理组件,为目标系统提供常用的复用功能模块的管理和使用说明初始化状态下包含用户管理功能、文件管理功能、系统操作日志功能等文件管理功能管理文件系统存储的文件,文件系统抽象了系统业务功能里附件上传和删除等功能,提供给其他业务功能进行文件操作的接口系统操作日志功能同理,是系统使用者在操作、使用时留下的操作踪迹,记录在日志库中,管理员通过可以跟踪他人操作的行为界面管理组件,通过读取其他模块的信息,最终为目标系统生成向用户展示界面的功能模块包括经由名称管理器配置的名称常量通过控制器找到的jsp页面进行展现,菜单管理部件读取的用户菜单项,和初始化提供给管理员的系统管理组件,都需要通过界面管理组件去生成和布局,最终展现给用户界面在运行时,界面管理组件生成的页面直接与用户交互.
3.3本章小结本章首先对可复用管理信息系统的使用角色进行了分析和分类,对使用场景进行了界定,通过图示的方式表明生成系统和可复用系统的整合然后介绍了界面方案里使用到的Sitemesh和Jmesa技术方法,该方案用来统一规定前端展现的框架和功能模块首页表格的展现,为可复用信息管系统的开发和设计奠定了界面基础接着,在此基础上,提出了系统的整体架构,界定并分析了架构里开发者和使用者的相关模块,并分析了系统中所有模块的结构,对较为重要的模块(主要以开发者模块为主)进行了较为详细的介绍,包括结构图和工作机制,对业务代码生成进行了分析,介绍了相关的配置树原理和生成器工作原理,同时也对其他模块进行了简略的介绍软件研究所硕士学位论文可复用管理信息系统总体设计第四章可复用管理信息系统的实现本章专注于可复用管理信息系统的具体实现细节,对在
3.2节系统架构里的各个模块分别做解释说明首先对开发者视角下的工具生成介绍,然后对系统运行时,集成在系统中可以被管理员直接使用的功能做介绍
4.1名称管理组件名称管理组件声明界面上若干能由界面配置组件统一显示的字段名称,还包括一些暗藏在session里的产量,用来验证用户登录,状态,ip,用户id等信息从系统视角看,名称管理组件是由开发者在开始时候可以改变的,如果修改了组件里的名称,是需要重新编译代码,部署新的程序的名称管理组件除css配置文件之外,主要表现是一张Java配置文件,在Constants.java中配置相关的名称常量如下表格展现的部分源码所示//namemanagerforthejsppublicstaticStringtitleName=复用系统Demon;publicstaticStringUSERNAME_KEY=username;publicstaticStringUSERID_KEY=userid;publicstaticStringUSER_ROLEID_KEY=userroleid;publicstaticStringUSER_IP_KEY=userip;//strutsmappingpublicfinalstaticStringSUCCESS_KEY=success;publicfinalstaticStringFAILURE_KEY=failure;publicfinalstaticStringLOGOUT_KEY=logout;publicfinalstaticStringINDEX_KEY=index;publicfinalstaticStringLIST_KEY=list;publicfinalstaticStringADD_KEY=add;publicfinalstaticStringEDIT_KEY=edit;其中,titleName是整个系统的标签显示的名称,User开头的是与用户登录后显示用户相关信息的字段,而与登录Struts映射相关的字段如success,编辑字段相关的如indexlist等等如果界面抽象的越细致,可以配置的条目便越多,随着工作的深入,可以提取更多的字段而这张配置表在系统运行时候,被框架装饰页解析,通过对常量的赋值便可使得包含在公共页面的字段得到体现如下表所示例是titleName如何在整个系统中展现%@pageimport=lding.*%%@pageimport=beans.*%%@taglibprefix=suri=/struts-tags%%@tagliburi=http://www.opensymphony.com/sitemesh/decoratorprefix=decorator%%@tagliburi=http://www.opensymphony.com/sitemesh/pageprefix=page%%@taglibprefix=curi=http://java.sun.com/jstl/core_rt%%StringtitleName=Constants.titleName;其中,jsp页面从常量中取得titleName,并且在框架里声明它作为所有经过Sitemesh过滤后装饰得到的页面名称titledecorator:titledefault=%=titleName%//title这样,通过固定titleName在整个系统页面中,便使得所以系统的title显示都是统一的显然,当新的项目开始时,开发者可以通过修改Constants文件,配置界面的部分公共显示
4.2分类代码元元素管理
4.
2.1工具要求和功能传统的分类代码管理对系统中存在的分类代码进行单独管理,即每一种分类代码都需要一个表,一套action操作文件和一套相关的jsp页面在可复用管理信息系统中,首先对分类代码的命名、界面展现做了同一管理,要求
1、分类代码管理页面路径显示必须是分类代码管理下的xx种类管理,首页展现的是用Jmesa表格工具显示的列表,标题2号字体,显示xx种类列表
2、增加页面竖直排列,并且只增加该种类下的名称name值(也可以增加其他其他条目,在Demo演示里只演示一种,如相关值对应的编号,添加人信息等),但保证其他种类也有,必须按照同一种相关格式
3、修改页面、详情页面等按照增加页面的排版、格式参照性设计
4、管理员角色下已经赋予了分类代码管理的一级菜单该一级菜单保证管理员确实是需要这个功能的,只不过在该功能下,目前暂时还没有相应的分类代码需要管理,旨在对新生成的分类代码能够有一级菜单项挂钩,保证生成的分类代码管理功能能够被菜单项解析展现这个要求同时需要结合菜单管理组件进行解释,在后面的章节会有叙述在满足以上条件下,对可复用管理信息系统中的分类代码可以从开发者角色下进行自动添加,添加后生成对应的路径、代码模板,页面展现等在可复用管理信息系统中,最终得到的元元素管理工具可以达到以下功能效果
1、开发者可以配置该种类分类代码的名称,并且该种分类代码的名称在管理员界面按照填写的分类代码名称进行显示
2、开发者可以不需要重启,也不需要对代码重新编译,也不需要部署新生成的功能以二级菜单的形式挂在管理员角色下的一级菜单下作为子菜单,在管理员刷新本页面(或者重新登录,或者完成权限添加,以此来触发菜单管理组件一次工作完成)后看到该功能
3、管理员可以在新生成的页面上进行该种分类代码的管理由此可见,通过参数化分类代码类型,进行配置形式的复用方法可以很好的实现上述的功能
4.
2.2实现细节分类代码管理的主要功能涉及到两个表,他们的关系如图4-1所示图4-1分类代码元元素管理工具数据库表左侧的ParaInfo是开发者视角下使用到的表,开发者通过向表格中添加一个常量,同时,向权限管理中写入该功能指向的url地址Maprequest=this.getContextRequest;try{pidao.saveparaInfo;RightInforightInfo=newRightInfo;rightInfo.setNameparaInfo.getName+管理;rightInfo.setParentidnewInteger8;rightInfo.setUrlpara/Para!manage.actionpid=+paraInfo.getPid;ridao.saverightInfo;}catchExceptione{e.printStackTrace;request.putshowMsgscripttype=\text/javascript\window.alert\Error\;jump\para/GeneratePara!manage.action\;/script;returnmanage;}request.putshowMsgscripttype=\text/javascript\window.alert\OK\;jump\para/GeneratePara!manage.action\;/script;returnmanage;从上表可以看出,写往权限中的名称,最终满足“xx种类管理”,并且设置关联的一级菜单权限是8,8是管理员分类代码管理一级菜单的权限id号在管理员登录后,在分类代码管理中就可以在菜单中看到其url,通过访问para/Para!manage.actionpid=xxx来定位到对应的种类分类代码,该action完成下述工作ifpid==nullpid=newInteger1;Maprequest=this.getContextRequest;Listlist=pvdao.findByPidpid;request.putresTablehtmllist;paraInfo=pidao.findByIdpid;request.putparaInfoparaInfo;returnmanage;从表中可以看出,除了要将该种类分类代码的list拿出来,还需要把对应pid的种类分类代码本身信息拿出来,即paraInfo,paraInfo信息送往response之后,在jsp页面,通过s:propertyvalue=#request.paraInfo.name/管理h2class=tab-h2s:propertyvalue=#request.paraInfo.name/列表/h2h2class=tab-h2s:propertyvalue=#request.paraInfo.name/信息/h2等变量形式的取名,最终完成对jsp页面展现时候,根据不同的pid值来获取不同的种类分类代码的名称该名称就是开发者在配置时写入的名称pid就像是门的钥匙,在对分类代码进行操作时,该pid一直被前端和后端承载如在写入数据库Value时,将pid记录附在数据的后面,很明显,数据插入之后,便进入到了pid对应的门在读取时候,只要附上pid的条件值,便可以找到该“门”下的所有数据,只要所有的请求响应都遵循携pid访问,那么虽然数据都存放在一个表格中,彼此也不会干扰
4.
2.3复用思想小结该种复用思想与模板复用有一脉相承,其中涉及到的隔离在线程内存管理,用户权限验证等各个方面都有体现,即数据、文件、代码都是一致的,只是对注入的具体值进行变量化,最后在最终展现运行时刻,凭变量的id值找到其对应的相关变量值的具体值,完成程序运行
4.3业务代码生成工具
4.
3.1工具要求和功能业务代码生成工具没有涉及到数据库,除了向权限表中添加一条生成后代码所对应的访问功能首页路径之外业务代码生成工具的要求如下
1、需要生成的业务功能已经完成了数据库表的建设,这个在设计整个系统的数据库关系时已经完成,可以通过pd工具来向数据库直接生成表格,并且已经反向了Hibernate的JavaBean
2、暂时只支持单业务模式,对外键等不支持相关的代码操作逻辑,但外键指向的条目可以被展现,被操作
3、首页显示的表格仍然遵循jmesh表格特点,最多支持8个显示列,加上最后的操作显示,一共是9列
4、add、update页面不区分该条目在界面显示时候是select还是input还是动态input,即不能指定选择某个条目在前端的展现方式从技术角度来说,上述的工具要求是苛刻的,可能并不完全是自动化的,但是这大大简化了用户配置表单的负担,另一方面,生成的代码还是可以修改的,都统一放在指定目录下,查找也很方便,即配置选择和手动修改其实工作量是相当的如果工作细化,是可以实现多配置的,那么工具要求也会相应的少一点,但从开发者工作量上其实没有改观最终生成工具完成的主要功能包括但不限于
1、开发者可以在开发者视角下通过简单的配置与业务相关的信息之后,一键向现有的系统中生成jsp、xml配置、jsp前端页面等代码
2、所有生成的代码都被合理有效的放在代码目录中
3、如果不需要进一步的修改,在重启系统之后(即重新部署,因为需要部署生成的xml和编译生成的java代码),即能生成访问该功能的菜单项,管理员可以参与协助修改,该权限分配给指定的用户
4、被分配的用户,登录后(或刷新,或者加载相关的权限功能,即触发一次菜单管理组件凭userid从权限列表中重新加载相关功能的一次运行)可以看到对应的生成业务功能的访问首页的地址,在菜单中以菜单项的形式表达为了完成上述的功能,拟采用基于模型的代码自动生成,最后,用从
3.
1.3节中提到的技术来整合要使用的模板,从模板即代码碎片中拼接得到一份有效的代码,作为最终输出结果
4.
3.2模板代码片段模板代码片段都是抽象了代码中公共的部分,将不确定的部分通过加上特殊标记的变量来表达的代码模块代码片段不能直接运行,也不能作为一个类或者一个函数来使用,从严格意义上来说,它不是代码,只是一段文本,只不过这段文本最后会成为运行的代码,如下java_footer.md示例privateStringjumpTipStringtip{Stringresult=scripttype=\text/javascript\window.alert\+tip+\;jump\auto/ldingactionNamelding!manage.action\;/script;returnresult;}}在上表中,最后的大括号是必须的,这是因为这个代码片段在整个java文件的最末尾,完成action函数的最后一个括号,除此之外,这段代码主要为整个action提供一个jumoTip函数,其中的ldingactionNamelding是从代码模板提取算法中导出的一个变量,这个分枝变量在这里得到体现,用户配置的actionName最后会替代这种ldingxxlding标记,成为最终生成后代码里的变量再如模板片段示例jsp_add_table_ele.md中trthwidth=30%divclass=sty-1sty-2ldingsetlding/div/thtddivclass=sty-nrinputclass=tab-inputtype=textname=littleBean.ldingsetldingvalue=s:propertyvalue=#request.littleBean.ldingsetlding///div/td/tr这里的tr和/tr标签是必须的,这个代码片段的主要功能是向jsp池里的生成后为add功能的jsp页面代码中添加一段与item有关的添加显示,这里的ldingset1lding是最终会被一个item条目名替代的变量,在最终生成的jsp增加功能页面里,这个变量会得到体现自动生成工具根据代码量的大小和完成的功能不同,而会有不同数量的模板随着功能的细分,模板也会更加细碎,因而,统一工作就显得尤为重要,不然所谓的模板内容还不如写死在生成代码中,反而会因为不需要进行文件读写显得更加灵活本文最终实现的业务代码自动生成工具一共分解得到了20多个模板,包括java、jsp和xml所有目标生成代码的所有模板代码片段
4.
3.3生成器周边功能业务代码生成过程的架构图如
3.
3.4节所述,在这个系统中,核心功能主要由生成器和周边服务完成,其中,文件操作createFileUtil.java主要提供的主要功能包括三个publicstaticintcreateFileStringdestFileName该函数接受一个带有路径文件名参数,函数会在这个文件所在的文件夹下创建这个文件,如果文件夹不存在,则创建这个文件夹,如果不可写或者文件已经存在,返回错误码,创建成功返回
1.publicstaticbooleancreateDirStringdestDirName该函数接受一个路径文件夹名称,函数会在指定的位置创建一个文件夹,如果文件夹所在的路径不存在,会进行新建,如果不可写或者文件夹已经存在,则返回错误码,创建成功返回1publicstaticStringcreateTempFileStringprefixStringsuffixStringdirName创建一个临时文件参数分别表示临时文件的前缀名,后缀名和文件生成的指定路径位置,如果路径文件夹不存在则进行创建,目录不可写或者其他错误返回错误码,创建成功返回
1.基础服务base为生成器提供一些基础函数服务,主要是为了给生成器在生成时候进行一些字符串操作,这些函数如publicStringfirstLetterUpStrings函数将参数的第一个字母变成大写参数是一个字符串,函数将第一个字母变成大写之后返回这个函数主要用来对代码中,get-set方法,会将普通的变量第一个字母变成大写而设计的,举例说明如userName,它的get方法名是“getUserName”,但是userName是一个变量,在生成之前是用生成标记lding标记的,只有在替换的时候才会将它变化,但是此时不能用userName替换,只能用第一个字母变成大写的来替换publicStringfirstLetterDownStrings函数将参数的第一个字母变成小写,参数是一个字符串,函数会将第一个字母变成小写之后返回这个函数主要用来对代码中变量的声明使用,会将一个类型的变量产生一个对应的实体,距离说明一个类是NoteInfo,申明其对应的一个变量是“NoteInfonoteInfo”,但是NoteInfo是一个变量,在生成之前是用生成标记lding标记的,只有在替换的时候才会将它变化,但是此时却不能声明为“NoteInfoNoteInfo”,只能显示的将第一个字母变成小写周边功能主要为核心生成器工作,生成器是代码生成的核心,如果功能很多,那么周边功能可能需要更多函数目前暂时还不支持生成的代码进行收回,如果有的话,文件服务还需要提供删除文件,修改文件,检查文件夹等功能
4.
3.4配置表代码生成之前,开发者需要填写一张生成目标代码的配置表,该配置表根据目前生成系统的要求而设计在桌面应用中,由于可以直接从本地文件夹读取相应的文件,因而可以省略相关的字段名的填写,但是在web中,浏览器不能直接读取本地文件,因而需要填写相关的字段,配置表截图如图4-2所示图4-2业务代码自动生成配置表界面截图在该表单中,填写了一部分示例,其中,id类型决定了最终代码中id的声明类型名称而id变量名是这个业务模式中id的名称,理论上来说,可以不需要这个id名称,可以所有的业务模块使用“id”来表示其主键,但是考虑到区分,还是可以配置的类型和名称一起构成了目标代码中对id的声明“LongStudentId”,该声明决定在修改和删除时候,在jsp页面和action页面进行传输的变量名Action名称是对功能的action命名,最终得到的结果如StudentAction.java,考虑到不影响功能间的区分,并且能够减少用户的配置,在Struts里访问的路径的名称,对应的Spring配置的功能名称都采用这一个名字功能名称是显示在jsp页面的名称,同时也是添加到权限数据库的访问名称在所有相关的页面上,包括位置显示,如“您的位置-菜单管理-xxx管理”,还有首页列表名,增加修改页,详情页的名称,即对这个页面进行一个名字的赋予一般最好用中文,如“票据”,那么最终得到的页面会显示票据列表信息等,在菜单管理器里,用户登录后看到的功能也会显示为“票据管理”JavaBean名称和DAO名称取决于先前在数据库表设计的时候,已经生成在系统里的bean名称,和DAO名称,这里依赖系统本身的完整性字段名,这里的字段名最好与bean里的字段名称一致,它的作用是通过获取列表信息的时候,通过Jmesh表格形式展现在功能首页的条目,同时,为了减少开发者的配置,显示的名字和这里的字段名是一致的,生成完成后可以在代码中直接修改配置表的多少和详细根据划分和抽象的程度有关系,很明显,如果要对显示的条目进行演示选择,那么set集合就会变成两列,多出的列表示展现类型,如果有外键,还需要指明哪个是外键,并选择引用的表抽象的越低,考虑的情况越多,那么配置表就越复杂为了简化问题,考虑从最基本的模型开始,有一些功能不尽完美,但不会影响总体复用框架
4.
3.5生成器生成器是生成过程的核心,生成器类GenerateAutoAction.java完成生成诸多代码的过程,该类包含以下这些成员finalprivateStringautoPath=E:\\Workspaces\\MyEclipse
8.5\\Reuse1\\src\\lding\\auto\\;finalprivateStringmodelPath=E:\\Workspaces\\MyEclipse
8.5\\Reuse1\\src\\lding\\para\\Model\\;finalprivateStringjspPath=E:\\Workspaces\\MyEclipse
8.5\\Reuse1\\WebRoot\\auto\\;finalprivateStringxmlPath=E:\\Workspaces\\MyEclipse
8.5\\Reuse1\\src\\;privateStringidType;privateStringidName;privateStringactionName;privateStringfunctionName;privateStringbeanName;privateStringdaoName;privateString[]set;如表所示,其中,autoPath是指明生成的javaAction代码最终写往的目录地址,modelPath指明所有模板存储的位置,而jspPath和xmlPath分别表示jsp页面和xml最终写往的目录地址下面一列变量是对应的配置表里的字段信息,不再赘述该生成类含有以下这些主要的私有函数,先进行介绍之后再介绍核心函数,核心函数里的过程里的函数会调用这些私有函数privatebooleanwriteFileBufferedWriteroutStringfileName该函数向指定的输出流中输出一段文件,参数out在传入之前已经绑定一个文件输出流,而fileName是一个已知的含路径的文件该函数在往指定流输出模板文件时候被调用当输出完成成功后返回true,否则返回falseprivatebooleanaddHtmlItemBufferedWriteroutStringset1Integerindex该函数完成向指定的输出流中输出一段html能使用到的element片段,参数out是输出流(一般是绑定目标文件),set1是这个片段对应的名称,index是这个片段在所有片段中的顺序号该函数在javaaction生成过程中,通过循环遍历set集合中的特点,向jmesa表生成过程,用来添加一个指定的列显示时被调用privatebooleanaddJspAddTableEleBufferedWriteroutStringset该函数完成向指定的输出流中输出一段jsp相关的代码段参数out是输出流(一般绑定目标文件),set是这个片段需要的项目名称该函数在生成jspadd/update页面时候,通过循环遍历拿到bean中所有字段,进行jsp页面的展现,这样的话,生成竖直排列的列privatebooleanaddJspDetailTableEleBufferedWriteroutStringset该函数完成向指定的输出流中输出一段jsp相关的代码段参数out是输出流(一般绑定目标文件),set是这个片段需要的项目名称该函数在生成jspdetail页面时候,通过循环遍历拿到bean中所有字段,进行jsp页面的展现,这样的话,生成竖直排列的展现列privatebooleancopyFileStringfile1Stringfile2该函数完成把file1经过正则整合后拷贝向file2中,参数file1和file2必须是含有指定路径含有文件名的全路径,文件不存在则失败该函数在最终完成临时缓存的temp文件输出之后,再进行拷贝到目标文件中在这个过程中,需要对temp文件中的lding标记进行替换,这样,得到的file2文件是最终的目标文件该生成类的核心函数是generate,在配置完配置表之后点击确定调用该函数,该函数主要执行以下几个函数generateActiongenerateJspManagegenerateJspAddgenerateJspUpdategenerateJspDetailgenerateXmlStrutsgenerateXmlSpring这些函数根据名称可以看出,分别产生对应的代码文件,分别表示生成javaaction文件,生成jsp页面的管理首页,增加页面,修改界面,详情页面,追加xml里的struts配置文件段,最佳xml里的Spring配置文件段以javaaction文件为例,下述是生成过程里的核心代码段首先创建一个临时文件用于拼接各个模板代码片段cfu.createFilethis.modelPath+temp.tmp;FilemyFile=newFilethis.modelPath+temp.tmp;如上表所示,创建文件temp.temp文件,并绑定到myFile上,然后,往该文件注入拼接模板片段BufferedWriterbw=newBufferedWriternewFileWritermyFilefalse;//reoverwritethis.writeFilebwjava_header.md;ifidType.equalsIntegerthis.writeFilebwjava_idIntegerModel.md;elseifidType.equalsLongthis.writeFilebwjava_idLongMOdel.md;elsethis.writeFilebwidStringModel.java;this.writeFilebwjava_queryModel
1.md;bw.write\t\t\t;forinti=0;iset.length;i++{ifset[i]==null||set[i].equalsbreak;ifset[i]!=null{bw.write\+set[i]+\;}}this.writeFilebwjava_queryModel
2.md;forinti=0;iset.length;i++{ifset[i]==null||set[i].equalsbreak;ifset[i]!=null{this.addHtmlItembwset[i]i;}}this.writeFilebwjava_queryModel
4.md;this.writeFilebwjava_getSet.md;this.writeFilebwjava_footer.md;如上表所示,首先往文件中写入header模块,包括java的import部分,类的声明部分和参数声明,然后根据id的类型不同选取不同的模板来拼接对id的get-set函数,之后,写入query模块的头部,再循环向目标中拼接set字段集合,再写入model2部分,最后循环写入每个字段对应的前端显示列列名,完成之后,model4完成对Jmesa排版的内部尾部,最后,写入其他声明的get-set函数,完成之后最终写入尾部模板,完成整个代码块的拼接但是得到的仍然是temp文件,最后要使用真实的文件进行替换copyFilemodelPath+temp.tmpautoPath+actionName+Action.javacopyfile函数是一个私有函数,该函数会检查在该路径下是否已经有存在的文件,如果有的话考虑到完整性,不久不会生成,往上层返回false,最后generate过程会被强制取消,并反馈结果给前端告知开发者,文件已经存在,不能重复生成相同的action如果替换成功,就会进入generate的下一个流程,生成其他的文件,其他的过程与该过程类似,便不再一一赘述在完成生成之后,对该功能产生对应的功能url,并根据functionName取名,存入权限表中RightInforightInfo=newRightInfo;rightInfo.setNamethis.functionName+Manage;rightInfo.setParentid5;rightInfo.setUrlauto/+this.firstLetterUpactionName+!manage.action;ridao.saverightInfo;访问路径同样将首字母变成大写,这是因为最终的配置在Struts里的Action也是大写,举例说明即使actionName是note,但是Java文件和Struts类仍然是Note挂在一级菜单项的id为5,该菜单项的名称是普通功能在重启后,如果开发者要将这个功能附在其他一级菜单的下面作为新的二级菜单,可以在权限管理里修改综上所述,生成器主要生成三类代码,生成完毕之后,还会向权限表里写入访问该功能的url和名称,经过开发者的赋权,对应角色的用户登录后便可以使用这个功能
4.4系统管理组件系统管理组件是集成在系统管理里的管理员可以直接使用的管理模块,包括用户管理,角色管理,权限管理,文件系统和日志系统其中权限管理即对功能权限的赋予和管理,也可以被开发者使用,以便开发者将自动生成的功能赋予给管理员而文件系统和日志系统除了提供给管理员管理界面之外还留下了一些开放的接口供开发者使用
4.
4.1用户-角色-权限在管理信息系统中,权限功能是管理员或者开发者添加的,每一个功能都需要一个入口,一般是一个业务的首页,在可复用管理信息系统中,一般都将对信息管理的列表作为功能首页,同时也作为功能的入口权限赋予给不同的角色,因而不同的角色登录后可以通过菜单管理器生成不同的菜单项,以此来看到不同的功能,实现划分和隔离同理,权限是按照角色划分的,但用户登录后,必须要有一个初始角色,如果用户的角色发生了变化,只要赋予其相关的角色即可,那么用户登录后看到的功能自然就不一样在系统管理员登录后,拥有对用户、角色、权限的功能功能涉及到的数据库如图4-3所示图4-3用户-角色-权限数据库关系存在两个关系表,映射相关的userInfo信息、RoleInfo信息和RightInfo信息,技术实现比较简单,在web端提供每个功能的管理界面,这些功能都统一放在可复用管理信息系统的system文件夹下系统交付后,运行时管理员便可以直接使用这些功能如果开发者需要进行一些修改,也可以直接修改系统中对应的代码,如userInfo需要增加字段等
4.
4.2文件系统在传统的管理信息系统中,有许多的业务功能模块都需要有附件上传的功能,如人员管理就会有头像上传,如果有票据就会有票据的收据文档,照片等资料上传这些业务之间本身功能可能不尽相同,在流程上也没有相似性,但是业务都需要做文件存储功能图4-4演示了传统系统中的业务模式对对象附件的处理,和转化为可复用系统后的对对象附件的处理图4-4附件上传的复用转变从图中可以看到,最后的逻辑业务模块对文件的存储就像在超市存包一样,只要将文件丢给公共接口,接口会返回一个凭号,以后操作文件只要调用接口,交给参数凭号即可实现修改、删除等文件的操作在存储这块,也只需要对文件实现统一命名、管理、存储,只需要在数据库实现一张统一格式的表格即可在可复用管理信息系统中,文件系统的示意图如图4-5所示图4-5文件系统示意图如上图所示,FileService是集成在系统中的文件接口,管理员通过界面可以直接实现对文件的管理,而开发者在使用系统时,看到的是文件系统的接口,开发者开发业务模块时,可以直接使用文件系统的接口在可复用管理信息系统中,文件系统提供以下接口publicListIntegersaveFilesIntegeruserIdFile[]filesString[]filesFileName存储文件参数UserId是当前操作业务模块的登录用户id,用来实现对文件的权限加锁,files和filesFileName对应的是在web应用中上传文件的浏览器缓存文件,可以理解为文件和文件名函数对用户进行验证之后,将文件统一命名到该用户的私人目录下,并按照日期分为子文件夹,并向数据库存储一条相关信息的条目,得到一个自增长的cfid号,并存入list中,最后,存储完所有的文件之后,将含有相同数量的cfid号的list返回publicintdeleteFileIntegercfidIntegeruserIdbooleanisCheckUser删除文件参数cfid是这个文件的凭证号,对应指定的文件,userId是登录用户的id号,isCheckUser是一个开关,当其为true时,对用户进行校验,不是文件拥有者不可以删除,而false时可以直接删除删除对应的文件和数据库条目,成功返回1publicintupdateFileIntegercfidIntegeruserIdbooleanisCheckUserFiledocuStringdocuFileName修改文件参数cfid是对应的文件所在表里的id,userId和ischeckUser同delteFile接口一致,对用户进行拥有权验证,File和docuFileName是修改后的文件以及文件名称同理,函数先根据条件对用户进行拥有权验证,之后删除旧的文件,存储新的文件,并对所在的数据库条目做修改,但是id不变成功返回1publicCommonFilegetFileByIdIntegercfid获取文件信息Cfid是存储文件时候产生的文件凭证,读取文件的信息,返回的是一个CommonFile类(可以认为是结构体),里面包括文件大小,路径,名称,拥有者信息等等,读取不需要做用户认证,即如果前端用户能看到这个文件,即产生对文件的读权限publicListgetFileByUserIntegeruserId获取用户名下的所有文件参数userId是登录的用户id,函数会对userid进行校验,之后返回该用户拥有的所有文件信息,组织成list返回,list里的元素是commonFile,如果userId是null,那么是管理员行为,可以获取所有用户的文件,对文件拥有查看权限在管理员登录时候,提供FileManageAction来管理文件,即FileManageAction.java文件,由于其遵循普通的SSH框架开发,比较简单,在此不再赘述,SSH框架参考
2.3节的介绍该函数结合前端jsp为管理员提供最基本的查看功能综上,文件系统统一了系统中所有文件的存储和命名工作,节省了开发者的时间体力,也为管理员提供了一套统一的管理界面这样的复用方法即部件复用在软件复用开发中经常使用
4.
4.3日志系统业务系统中的个人行为希望被管理员追溯到,比如某个用户添加了一个票据等行为,这样的功能主要给整个系统的操作留下印记,以便将来发生相关问题的时候能够找到责任所在,有据可循实现方面,日志系统与文件系统相似,向管理员提供一个日志的统一管理功能,向开发者提供一个增加日志的接口,数据库表需要对日志的等级和类型进行划分,因而存在一个日志的登记表和类型表作为常量并且向整个系统提供一个日志服务,该服务一方面作为开发者开发系统时能够写入日志的接口服务,另一方面,管理员登录后可以进行日志的管理,删除,打包下载等功能LogService含有以下常量publicfinalstaticIntegerGRADE_ALL=newInteger0;publicfinalstaticIntegerGRADE_HIGH=newInteger1;publicfinalstaticIntegerGRADE_MED=newInteger2;publicfinalstaticIntegerGRADE_LOW=newInteger3;publicfinalstaticIntegerOP_ALL=newInteger0;publicfinalstaticIntegerOP_ADD=newInteger1;publicfinalstaticIntegerOP_DEL=newInteger2;publicfinalstaticIntegerOP_UPT=newInteger3;publicfinalstaticIntegerOP_QUERY=newInteger4;publicfinalstaticIntegerOP_OTHER=newInteger5;其中Grade_xxx常量对应的是日志等级的常量,而OP_xxx常量对应的是日志操作的行为将这些定义为常量有助于在接口提供一个统一的名称来替代晦涩难懂的数字含义LogService提供以下主要的接口publicintaddLogIntegergradeNumIntegeropNumStringmsg增加一条日志参数gradeNum和opNum是等级和行为常量,msg是操作的内容,该接口在发生用户操作行为时候被调用,用来记录一条操作行为存储成功后返回1publicintdeleteLogIntegerlogId删除日志参数是日志的id,完成删除后返回1publicCommonLoggetLogByIdIntegerlogId获取日志logId是日志的id返回含有日志相关信息的一个类CommonLog,包括等级、行为,时间,操作人等信息publicListgetLogsStringusernameIntegergradeNumIntegeropNumDateTimeltimeDateTimertime获取日志列表参数是相关的条件,username是操作人的用户名,gradeNum是操作等级,opNum是操作行为号,ltime和rtime是操作时间的区间获取日志后,返回一个list,list里面的元素是CommonLog类,该类里有日志相关的所有信息publicintdelLogsByCondStringuserNameIntegergradeNumIntegeropNum按条件批量删除日志参数userName是用户名,gradeNUm和opNum是日志等级和行为编号,可以参考上述的常量而管理员对日志的操作主要通过LogAction来实现,LogAction除了提供一般的增删改查等功能之外,还提供批量删除、批量备份的功能综上,日志系统记录了系统中所有用户操作的行为规范,以便管理员统一对这些行为进行监督和规范,同时,也理清了各个用户对数据的操作为了方便管理,还提供了批量备份,导出、删除等功能
4.5菜单管理组件菜单管理组件主要完成根据登录用户所拥有的权限功能,按照一级二级菜单的形式进行展开,并附在框架页的左侧,通过这种方式来实现,分配功能权限即可完成对用户权限的控制,而且支持实时动态刷新,菜单管理组件功能实际上在登录和权限赋予的时候运行即可,因为其他的情况下,用户的菜单项不会发生变化,因而也不需要进行刷新在登录的时候,菜单管理组件在后台执行读取权限并按照一级二级菜单分列的形式,如下表所示nodeList.clear;Stringuserid=getRequest.getSession.getAttributeConstants.USERID_KEY.toString;StringsqlStr=fromRightInforwherer.idinselectrr.rightidfromRoleRightrr+whererr.roleidinselectur.roleidfromUserRoleur+whereur.userid=+userid+orderbyr.rightidASC;Listlist1=rightd.findByHqlsqlStr;/*下面的for循环用于保证相同父节点的子节点排列在一起,保证功能树父子关系在JSP里的正确显示*/forintm=0;mlist
1.size;m++{RightInforight=RightInfolist
1.getm;ifright.getParentid==null{//是顶级节点(没有父节点),就直接放到nodeList里,然后遍历所有节点找到它的子节点放到nodeList里nodeList.addright;forintj=0;jlist
1.size;j++{RightInforight1=RightInfolist
1.getj;ifright
1.getParentid!=nullright
1.getParentid.intValue==right.getRightid.intValue{nodeList.addright1;}}}else{//notthefirstlevelnodedonothing}}getRequest.getSession.setAttributenodeListnodeList;从表中可以看出,首先通过用户对应的角色所具有的权限,先全部select出来,然后再进行排版,保证一级菜单下跟随的都是以其为父节点的二级菜单,重新组织成一个nodeList,放入session中,这样,只要用户在登录状态下就不需要刷新,而这张菜单表也可以保持静态在完成这些工作之后,Action进行return,通过界面管理器时,用Sitemesh过滤器,将这段菜单按照缩进的方式展现在前台Commonframe里,核心代码如下%intflag=0;forinti=0;inodeList.size;i++{RightInfour=RightInfonodeList.geti;ifur.getParentid==null||ur.getParentid.equals{//leveloneitemmenu%lipclass=li-titiclass=ico-1/ispanclass=tit-txt%=ur.getName%/span/p%flag=1;}elseifur.getParentid==null||ur.getParentid.equalsflag==1{//leveloneitemmenu%/lilipclass=li-titiclass=ico-1/ispanclass=tit-txt%=ur.getName%/span/p%}else{//是“二级”节点%pclass=li-txticlass=ico-2/ispanclass=con-txtahref=%=request.getContextPath%/%=ur.getUrl%class=activetarget=_parent%=ur.getName%/a/span/p%}%%}%/ul从上表可以看出,一级菜单不对应具体的url,二级菜单挂在一级菜单之下,拥有对应的功能url,并且与一级菜单的图标不同正是因为这样的设计,所以自动生成里的功能模块最后访问的功能url存储到权限表里时,都需要一个父节点的原因,当然,如果需要重新挂父节点,也只需要在权限管理里做修改即可
4.6其他模块简介从架构图上看,系统还有一些其他的模块(或者是存储)需要介绍,除了上述章节详细介绍的功能在之外,其他的功能比较简单,或者实现部分代码不多,放在一个章节里描述按照系统架构里模块从下往上的方向进行介绍权限管理和配置db是相互关联的,配置db将功能模块的访问url都存储下来,一方面,可以通过菜单管理组件来动态生成不同角色下的菜单项,另一方面,开发者生成的自动功能访问的url都会写入这个配置db代码目录是一个逻辑概念,在系统中,生成的代码最终按照类型不同,同时也是SSH框架要求,其中,javaaction文件放在目录./src/lding/auto下,xml配置文件放在目录./src下struts文件是struts-auto.xml,spring配置文件是autoContext.xml与其他xml配置文件一起,而jsp文件放在目录./Webroot/auto下控制器主要完成对代码的解读,由于代码生成过程中本身就遵循SSH架构设计,所以没有其他要求界面管理器主要通过第二章介绍的界面控制技术来实现,其中,主要管理界面框架文件./Webroot/decorators/common.jsp文件,框架主要包含四个区域,最上面的区域是标题,目前集成在系统中的是现实用户和实时更新当前时间,并附上一张表示该系统名称的图片(这些都可以配置修改),中部左侧是菜单项,而右侧是空白的div区,该区是展示相关信息业务的地方,初始的时候显示欢迎文字最下方是授权声明,目前系统集成的是本文作者的邮箱和版权声明,都可以修改成以后管理信息系统相关的法律信息或者友情链接等综上所述,可复用管理信息系统使用了多种复用方法,为开发者和管理员都提供了一些可以直接使用的功能或接口,这些功能最终都是为系统本身服务的
4.7本章小结本章主要对可复用管理信息系统的实现细节进行了介绍,按照系统设计里的思路,依次对名称管理组件,分类代码元元素管理工具,自动生成工具,系统组件,菜单管理器、其他功能等进行详细介绍,完整的呈现了整个系统的实现过程和细节软件研究所硕士学位论文可复用管理信息系统的实现第五章实验本章主要对可复用管理信息系统进行测试,首先对管理员视角下的功能进行展示,然后对开发者的功能进行测试
5.1系统展示整个系统从登录界面开始,登录之后根据用户的角色展现管理界面,如图5-1所示管理员登录时界面和图5-2所示管理员登录后看到的管理界面图5-1可复用管理信息系统登陆界面图5-2可复用管理信息系统管理主界面登陆界面的背景图是可以变化的可以配置的,而管理界面显示用户名欢迎,以及时间和主界面标题的“复用系统”图片,最下方显示的是版权声明(未显示在截图中),左侧是管理员拥有的(在系统初始状态下)菜单功能,中间是权限功能的首页,即全新信息的列表展现这些可配置可框架页,是通过名称管理组件、界面控制器等配合产生的,经过统一后的界面,才有更多可以复用的点系统含有三个不同角色的帐号,开发者developer,管理员admin,普通用户test_user1,不同角色的用户登录后看到的功能是不同的,通过菜单管理器可以实现,如图5-3所示图5-3不同用户登录的一级菜单显示开发者拥有权限赋予和自己的开发者选项,而管理员有系统管理和分类代码管理这些功能,普通用户的功能是管理员分配的,在角色管理里进行权限赋予通过权限管理和菜单管理组件,实现了不同用户登录看到不同菜单的功能在系统管理组件里,管理员的功能有用户管理、角色管理、权限管理、日志管理、文件管理等,如图5-4所示角色管理功能图5-4角色管理中选中普通角色进行权限赋予在上图中选取指定的角色,然后点击设置权限,对该角色设置权限,如图5-5所示图5-5对角色进行权限赋予将演示功能2也赋予给角色1,那么测试用户test-user1登录的时候就会看到这个功能
5.2开发者功能演示开发者功能包括两个,如在图5-1中所示,一是分类代码元元素管理,二是业务代码自动生成分类代码元元素管理如图5-6所示图5-6分类代码元元素管理首页如需要添加新的分类代码,只需填写一个分类代码的名称,如图5-7所示图5-7添加分类代码元元素信息点击保存后完成保存,跳转到列表页,如图5-8所示即使在系统维护过程中,仍可以对这个“论文种类”进行名称上的修改图5-8分类代码元元素管理首页显示论文种类新生成的功能就出现在权限列表里,将其赋予给管理员,如图5-9所示图5-9将新生成的分类代码管理功能赋给管理员点击保存后,管理员的菜单项里便具有了该功能的操作项记录在权限里的数据,在管理员登录后便可以在分类代码管理一级菜单下看到,如图5-10所示图5-10管理员登录后看到新的分类代码管理界面对应的分类代码管理界面已经自动展现,点击新增向这个分类代码添加几条数据,如图5-11所示图5-11添加若干值后的论文种类管理首页对应的数据管理项,id不是从1开始的,该id是全局的,不会影响系统开发和其他业务功能对分类代码的引用代码自动生成原理与之类似,同理,在开发者登录后填写一张生成代码的配置表,如图5-12所示图5-12业务代码自动生成配置表单点击生成后便会进行代码生成,完成之后,在‘系统管理-权限赋予’里将生成的功能权限赋予给一个用户不妨将该功能权限赋予给管理员,对整个系统进行重启,完成对生成的代码进行编译和部署,再用管理员角色登录,看到自动生成的功能首页如图5-13所示图5-13学生管理功能首页管理员的菜单项增加了一个学生管理项,链接到的首页功能是该学生管理的列表展现页,此时,学生管理便可以直接使用,如点击add为学生管理增加一个学生信息,如图5-14所示图5-14添加一条学生信息后管理功能首页示意完成张晓明信息的添加后,列表出现了张晓明的信息从演示可以看出,管理员拥有对该业务的管理功能在添加一个业务功能的整个过程中,开发者不需要写任何代码,只需要填写一张配置表,点击生成,再编译、重启系统即可
5.3本章小结本章主要对可复用管理信息系统进行实验,包括界面的展示,使用部分截图示例解释说明功能的作用,还对开发者使用的工具进行了实验,验证了在管理员登录后确实可以使用对应工具产生的业务操作代码实验结果表明可复用管理信息系统运转良好,开发者功能可以生成有效可运行的代码,避免开发者重复劳动,节约开发时间软件研究所硕士学位论文实验第六章结束语本章对全文工作进行总结首先概括了论文工作的主要贡献,然后提出了进一步工作的目标
6.1工作总结本文针对传统的不可复用管理信息系统的缺点,从不足出发,设计并实现了一个可复用的管理信息系统在该系统中,一方面集成了管理员常用的系统管理功能,实现了权限配置,菜单分离,界面统一等工作;另一方面,向开发者提供了相关的复用包的接口,还为开发者提供了两个代码生成工具具体来说,包括以下几方面工作
1、原型系统框架可配置实现原型系统快速部署,使用SitemeshJmesa等开源技术编制系统框架界面,独立动态的菜单显示栏,提供一个公共的前端显示框架,将展现内容统一放在框架中
2、分类代码动态配置将系统常用的分类代码编制成动态,实现从开发者配置名称,实时生成管理员可管理分类代码的界面和数据页面等功能
3、业务代码自动生成基于MDD技术,利用模板拼接的方法自动生成业务代码,开发者填写配置表生成的代码经过部署后可直接使用,操纵业务数据
4、集成常用的系统管理功能实现对用户、角色、权限的三级分配和管理界面,对文件组件和日志组件除提供给开发者开发接口之外,还集成了管理这两个功能数据的管理界面
6.2进一步工作由于时间所限,本文对可复用管理信息系统的设计与实现还不尽完善,有一些方面还需要进一步的研究,总结如下
1、配置化工作的界面显示,即界面配置不需要开发者修改配置文件,而提供一个友好的界面,通过填写一份配置表格而直接生成这个配置文件,从而界面的部分文字,包括Session里的字段都可以生成
2、分类代码动态配置支持多级联动目前的分类代码元元素管理工具还只是支持一级(或者二级,道理相同),但不能在同一个表里同时支持一级的和二级的和三级的分类代码联动联动后的分类代码工具使用范围更加广泛,但是实现方面需要在现有的技术方法上做一点改变,一种可行的方案是为ParaName表加设级数选项,在ParaValue里添加二级、三级列,和对应的一级父亲id、二级父亲id等列只是一种想法,时间有限暂时不能验证,有待进一步研究
3、自动生成可以同时支持多个表(即多个JavaBean),这是一个质变的过程,如果要操作两个表,就要考虑两个表的关系,是主从还是并列还是顺序,不同的关系决定了前端、代码逻辑和配置文件的不同,提取的模板会更多,对应的代码生成逻辑也更加复杂而如果操作更多的表,就会更加复杂
4、集成的常用系统管理功能也可以扩展、配置目前集成的常用功能数量有限,通过进一步的总结,可以在可复用管理信息系统中集成更多的系统管理功能,并且能为这些管理功能提供一个选择的表格,让用户自己定制想要的系统管理功能软件研究所硕士学位论文结束语参考文献杨芙清朱冰梅宏.软件复用[J].软件学报
199569.FUNCTOR.EMBEDDEDDOMAINSPECIFICLANGUAGESMEASUREDIMPACTOFREUSEINSOFTWAREDEVELOPMENT.Availablefrom:http://www.functor.se/research/technology/reuse/.MorisioEzranM.Tully.Successandfailurefactorsinsoftwarereuse.SoftwareEngineeringIEEETransactions
2002.284:p.340-
357.ThijmenDeGooijerHeikoKoziolek.AgreementsforsoftwarereuseincorporationsinACMProceedingsofthe20139thJointMeetingonFoundationsofSoftwareEngineering
2013.RyanGerardRobertR.DownsJamesJ.MarshallRobertE.Wolfe.TheSoftwareReuseWorkingGroup:ACaseStudyinFosteringReuse.IEEE
2007.47:p.24-
29.NASAESDS.SoftwareReuseWorkingGroupCharterfortheSeedsReuseWorkingGroup
2004.JavaPlatformStandardEd.
8.packageofjava.util.function.Availablefrom:http://download.java.net/jdk8/docs/api/java/util/function/package-summary.html.TheJavaTutorials.WhatisInheritance.Availablefrom:http://docs.oracle.com/javase/tutorial/java/concepts/inheritance.html.邱万彬张国杰裘鸿林.Java中的组件复用相关技术.计算机应用
2005.
251.陈岳鹏戴永成崔静.基于面向对象的软件重用技术.河北工业科技
2009.
9.叶青青江水.基于语义与句法的Java类库检索方法与系统.计算机工程
2004.
3033.张文娟邵维忠赵俊峰麻志毅.面向对象软件开发工具集中类库和模型库的研究与实现.计算机工程
2002.
283.王忠群.面向对象技术和基于数据驱动的软件重用.计算机应用
1999.
198.MeenaJhaLiamO`Brien.AComparisonofSoftwareReuseinSoftwareDevelopmentCommunities.IEEE
2011.511:p.313-
318.徐龙杰万建成.基于模型的用户界面代码自动生成.计算机工程与应用
2004.124:p.112-
115.RalfGitzelMichaelSchwind.ExperiencesWithHierarchy-BasedCodeGenerationinthej2EEContext.ACM2006:p.216-223万东.基于GEF和EMF的JavaEE快速开发工具设计.现代电子技术
2010.
3310.EliTilevich.Reusableenterprisemetadatawithpattern-basedstructuralexpressions.inProceedingsofthe9thInternationalConferenceonAspect-OrientedSoftwareDevelopment
2010.p.25-
36.WangHong.Architecture-CentricSoftwareProcessforPatternBasedSoftwareReuse.IEEESoftwareEngineering
2009.
4.JessicaRubart.Architectingstructure-awareapplications.inProceedingsoftheeighteenthconferenceonHypertextandhypermedia.2007维基百科.JavaEE.Availablefrom:http://zh.wikipedia.org/wiki/Java_EE.杨涛周志波凌力.基于Struts和Hibernate的J2EE快速开发框架的设计与实现.计算机工
2006.
5.梁立新.项目实践精解—基于SSH的java应用开发.
2006.TheApacheSoftwareFoundation.AboutApacheStruts
2.
2013.Availablefrom:http://struts.apache.org/release/
2.
3.x/index.html.developerWorksSpring系列.Spring框架简介.
2005.Availablefrom:http://www.ibm.com/developerworks/cn/java/wa-spring1/.ViralPatel.IntroductionToHibernateFramework.
2011.Availablefrom:http://viralpatel.net/blogs/introduction-to-hibernate-framework-architecture/.Wikipedia.thefreeencyclopedia.SiteMesh.
2013.Availablefrom:http://en.wikipedia.org/wiki/SiteMesh.薛亮葛玮郝克刚.基于Struts与SiteMesh框架的Web应用研究.计算机技术与发展
2006.
163.朱敏.一种基于SSH框架的MIS代码生成系统的设计与实现.南京师范大学学报:工程技术版
2012.
123.杨兴涛苏桂平王瑞芳王小芳.特定领域建模与代码生成的研究与实现.计算机系统应用
2009.
184.韩睦华刘雷波魏少军.基于相似结构自动提取的SoC划分方法.计算机工程
2010.361:4-
6.李琰李田谢冰张路孙家.一种基于P2P支持检索条件重构的构件库互联技术.计算机研究与发展20074412:2122-
2129.软件研究所硕士学位论文参考文献软件研究所硕士学位论文发表文章目录发表文章目录
[1]刘焕许舒人.基于SSH框架的java代码自动生成.计算机系统与应用.已录用.致谢三年的所示生活忙碌而充实在这期间,许多人在很多方面给予了我大量的帮助借此论文结束之际,走在毕业的前夕,我非常荣幸地,也很真诚地向他们表达我一直以来的感激之情首先我要感谢我的导师许舒人老师许老师是一位待人宽和、要求严格的好老师,他为我在硕士学习期间的研究工作提供了优越的学习工作环境,在参与课题组内的研究项目过程中,他给了我很多指点,给我很多帮助,在我遇到困难的时候鼓励我,也包容我犯下的技术错误,指点我快速进入角色,在成长的道路上使我受益匪浅从论文开题、中期到最后撰写的过程中,许老师都对我给予了大量的指导和帮助,这才能使得我的论文顺利开展、深入、成型一遍遍的修改,一遍遍的尝试,让我从论文研究过程中也逐渐找到了研究的状态许老师渊博的知识给了我深深的启迪,他严谨的治学态度和敬业精神深深的感染了我,鞭策着我不断前行,这将会使我终生受益其次,非常感谢实验室其他的老师们,他们是黄涛老师、钟华老师、魏峻老师、金蓓弘老师、叶丹老师等感谢他们为我和其他同学所创造的舒适的学习、科研环境,使得我们可以站在巨人的肩膀上,快速的积累宝贵的科研知识和技术经验在硕士学习期间,我一直在应用开发组学习,在此感谢应用开发组所有的成员,他们是李培军、魏克刚、李慧、唐建、李文海、刘翔龙、董源,跟他们在一起工作非常愉快,怀念那些一起加班、一起开发、一起讨论问题的日子,与他们的讨论使我获益匪浅,同时也感谢他们在我的生活、学习、成长过程中提供的无私的帮助和支持感谢实验室所有的师兄、师姐、同学、师弟、师妹们,我将永远珍惜、怀念这三年一路走来的点点滴滴,尤其要感谢吕瀛、高强、吴添勇、闫东旭、江浩亮等一起战斗过的同学们尤其要感谢吴添勇同学,在我论文开题、中期、撰写的过程中,在我没有思路的时候,去打水路过他的工位与他讨论,给了我很多灵感在这即将各奔前程之际,竟有些依依不舍,祝愿大家都能有美好的前程感谢我的舍友们,他们是杨龙飞、吕瀛感谢他们给我营造了良好的生活环境,提高了我的睡眠质量,感谢他们一直以来对我的照顾以及对我的包容,不是兄弟却胜似兄弟感谢我的父母,感谢他们的养育之恩,对我无私的奉献和关怀和支持是我不断前进的动力祝福他们永远健康快乐!感谢自己,感谢自己一直以来的坚持和努力!纵向↓横向→用户管理角色管理权限管理文件管理……界面登录、菜单控制、框架页、功能首页表、欢迎文字、标题等业务逻辑增加逻辑、删除逻辑、修改逻辑、列表查看、权限展现等数据存储附件存储、日志记录、内容数据库等。