基于反射机制的框架研究与实现毕业论文_第1页
基于反射机制的框架研究与实现毕业论文_第2页
基于反射机制的框架研究与实现毕业论文_第3页
基于反射机制的框架研究与实现毕业论文_第4页
基于反射机制的框架研究与实现毕业论文_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

基于反射机制的框架研究与实现RESEARCHANDIMPLEMENTATIONOFTHEFRAMEWORKBASEDONREFLECTION专业:2010信息与计算科学指导教师:申请学位级别:学士论文提交日期:2014年6月12日摘要目前,随着互联网应用的快速发展,软件运行环境正从一个集中封闭计算的平台走向开放、动态的计算平台,并且基于服务的计算模式将逐渐取代它,因此这些变化传统软构件技术应对起来很困难。本文针对目前框架复用程度不高,无法适应动态运行环境和多变用户需求这些问题,基于反射理论,研究具有灵活性和自适应性的框架。框架具有减少代码冗余,提高运行速度,便于维护,规编程等优点。Java反射机制是在运行状态当中,对于任何一个类,都可以知道这个类的所有属性与方法;对于任何一个对象,都能够调用它的一个方法与属性;这种动态获取信息和动态调用对象方法的功能称为Java语言的反射机制。反射其实就是程序可以对自身信息进行检查。在程序中能够检查某类中的方法属性等信息,而且能够动态调用。这样就能够写出很灵活的程序。例如想要把一个对象中属性名一样的数据复制到另外一个对象中,就可以利用反射,而且不需要指定每个属性名字,只需要动态从类中获取信息,再判断属性名是否一样就可以了。本课题旨在基于反射机制对框架进行研究,实现一个轻量级的框架以此来适应小的系统。轻量J2EE应用是对经典J2EE应用的简化,在保留经典J2EE应用的架构、良好的可扩展性、可维护性的基础上,简化了J2EE应用的开发,降低了J2EE应用的成本。关键词:反射机制;轻量级;框架ABSTRACTCurrently,withtherapiddevelopmentofInternetapplications,softwareoperatingenvironmentismovingfromacentralizedclosedcomputingplatformtoanopenanddynamiccomputingplatform,service-basedcomputingmodelwillgraduallyreplaceit,therefore,thesechangestraditionalsoftwarecomponenttechnologyisverydifficulttodealwith.Inthisarticle,Fortheseissuesaboutcurrentsoftwarecomponentrepeatedutilizationisnothigh,dynamicoperatingenvironmentcannotmeetandthechangingneedsofusers,accordingtothetheoryofreflection,thisarticleresearchesasoftwarecomponenttechnologywhichishighflexibilityandadaptability.Theframeworkiswiththeadvantagesofreducingcoderedundancy,improvingthespeed,easeofmaintenance,standardizedprogrammingandsoon.JAVAreflectioncanknowallthepropertiesandmethodsofanyoneclassinrunningthem;Foranyobject,itisabletocalloneofitsmethodsandproperties;Thefunctionofaccessingtoinformationdynamicallyandcallingobjectmethoddynamicallyiscalledreflectionmechanismofjavalanguage.Actually,reflectionisaprogramcanchecktheinformationontheirown.JAVAreflectionmechanismcancheckthepropertiesofcertainmethodsininformation,andinvokedynamically.Thismakesitpossibletowriteaveryflexibleprogram.Forexample,someonewantstocopyanobjectattributewiththesamenameasthedatatoanother,hecanusereflection,withoutneedingtospecifythenameofeachattribute,onlyneedtogetinformationfromadynamicclass,andthendeterminewhetherthesamepropertynameonit.Thisarticleisbasedonresearchingthereflectionmechanismframework,achievingalightweightframeworkinordertoadapttothesmallsystem.ApplicationofLightweightJ2EEissimplifiedbyclassicJ2EE,Onthebasisofretainingtheclassicapplicationarchitecture,goodscalability,andgoodmaintainability,itSimplifiesapplicationdevelopmentandreducesapplicationcosts.Keywords:Reflection;lightweight;framework目录第一章绪论1第一节论文的背景1第二节论文研究目标1第二章相关概念以与概念之间的关系2第一节反射机制2第二节轻量级2第三节设计模式简介2第四节框架3第五节架构4第六节框架与架构关系4第七节框架与设计模式关系4第三章系统开发环境技术介绍6第一节MyEclipse介绍6第二节MySQL数据库介绍6第四章框架研究8第一节Struts2框架8第二节Spring框架8第三节Hibernate框架9第四节Java优点10第五章框架与数据库连接工具12第一节JDBC介绍12第二节连接池13第三节几种常见的连接池14第六章建立数据库17第一节数据库表的结构17第二节创建数据库部分代码与结果17第七章基于反射机制框架的设计与实现19第一节框架的总体设计19第二节具体代码介绍20第三节代码测试22第八章论文总结与展望30第一节本文总结30第二节未来展望30参考文献31致32第一章绪论第一节论文的背景随着软件不断升级的规模和复杂性,在软件工程中,大家更加深刻的认识到系统构造的整体设计与规格说明的重要程度早已高出数据结构以与特定算法的选择,而且系统的成功需要优良的体系结构来保证。伴随软件技术和软件领域的不断发展,复杂性越来越大。越来越多的问题需要开发人员的解决,当然解决的方法、方案各不一样。开发人员或者设计师如何在以前的工作基础之上开发新的设计,对以前的成功案例进行复用。因此,软件重用技术越来越被人们所重视了,设计模式和框架渐渐产生。由于开源软件兴起,框架更是层出不穷。架构是软件系统由整体到部分最高层次的划分,大多数是由多个不一样领域框架构成。一个成功的体系架构有助于成功的软件促成,但软件体系结构需要一个复杂的和不断改进以建立的过程。软件开发人员不可能为每个不同项目,使用不同的构架,那样既耗时又费力。能够重用以前构架,或者开发通用构架是每个开发者所想要的。在不同的框架中如何选择适合应用的框架,以与如何让每个应用层完美连接?如何整合框架,才能使各层之间互相作用是以都以一种松散耦合方式而不用去管底层技术细节?软件开发人员需要解决这些问题。第二节论文研究目标框架核心的价值是对知识的积累。但由于知识只存在于编程人员大脑之中,因此是很难进行累积的。在软件开发中,代码是确定的知识,人力或者机器可读取代码都能够理解代码的目的,而且会出现一样的理解,因此最好的办法是使用代码对知识进行积累。框架就是这种思想产物。框架包括了少许代码,它们描述了在某一个围问题中抽象概念和抽象概念之间的关联。因此能够利用框架对知识进行积累。框架定义了扩展方式以此规框架的使用行为。复用和在包装的思绪让软件能够保持总体构造稳定性与扩展性。针对当前有多种流行的Java框架,这些框架中有优秀的设计思想,有优秀的设计模式,也有数不清的成功的商业应用案例,同时,它们所使用的Jar文件也有成百个模型,所以对于小的系统不太适合,本课题旨在基于反射机制对框架进行研究,实现一个轻量级的框架以此来适应小的系统。轻量级J2EE是在对经典J2EE的应用的简化,同时在保存了经典的应用体系结构,优秀的可扩展性,可维护性基础之上,简化了应用的开发,削减应用成本。第二章相关概念以与概念之间的关系第一节反射机制Java反射机制在运行时,对任何一个类都可以了解此类的全部属性与方法;对任意一个对象,都能够调出应用它的一种方法与属性;这类动态获得信息和以动态方式去调用目标的功能叫做Java语言反射机制[1]。Java语言产生的原因是为了适应网络应用。语言的反射机制的开发和实施,其目的是能够传递网络中的对象,并可以根据传递的对象的信息来重建对象本身,因此重建是动态的。在远程过程与远程方式调用功能达成中,反射机制起到了很大的功用。也的确是在这些基础之上孕育了Java的各类新技术。在Java语言中,一个类具有不同的属性和方法,通过相关类来实现对其信息的提取与重构。第二节轻量级所谓“轻量级”,并非“设计简陋、功用少、实现粗陋”的意思。它的设计理念哲学意义是“很多的操作不需要分布式以与不需要那些重量级的技能,比方说JNDI,将应用中没必要的技术隔离或者改造是有必要[2]。完全能针对目前最常见、简易的使用中的场景来设计,有特殊的需要时,再想办法解决问题就行”。“轻量级”包含两个概念:1、对编程模型和更具响应能力的容器简化,对传统J2EEAPI有关不必要的复杂性与限制进行清除。2、对于需求常常测试调试的开发,缩小应用程序部署时间是很有必要的。第三节设计模式简介一、模式的历史设计模式最早源于建筑学。在20世纪70年代,建筑学家CHRISTOPHERALEXANDER完成了许多专著,在这些专著中有些记录了建筑学以与土木工程学的模式。之后,软件开发的一些模式先驱们在CHRISTOPHERALEXANDER的专著中得到了灵感,从此软件开发就有模式这一观念了[3][4]。经过ErichGamma、JohnVlissides、RalphJphnson、RichardHelm四位作者的文章[5],软件开发中的模式观念得到了普与。GOF在他们的作品中共记录了常用的设计模式,这些模式后来被人们称为GOF模式。当然,他们的作品中描述的模式并非他们自己发明的。而是他们在发现许多类似的设计方案,这些设计方案在很多项目重复的出现,他们总结出这些模式,并记录在书中。当GOF的作品出版之后,大量类似的软件模式书籍相继出现,这些著作涉与到各个领域和用途。二、模式的定义其实模式很难有固定的定义,Alexander描述的是:“模式描述了在人们四周不停的反复发生的问题和这个问题解决方案的主旨。如此,人们就可以屡次的运用该方案而不必去做同样的劳动了”。虽然Alexander说的是建筑的模式,但这个定义在软件设计中也能很好运用。一个模式一般有四个基本要素[5]。“模式名称”是一个助记名,对于模式想要解决的问题、效果以与解决方案能够利用一两个词汇进行描述。“问题”描述了模式适用场景并对设计问题以与问题存在的因果进行解释。“解决方案”表达了设计组成部分以与他们之间的合作方法和各自的任务。“效果”表达了了模式应用效果和使用模式权衡问题。三、模式的作用每个设计模式体系的评估、注解和定名了面向对象系统中一个首要并且反复出现得设计[6],用这样的模式会使我们获益良多。第一,模式可以让我们重用成功设计与体系结构。通过模式提供的方案都在不同时间、不同项目中被反复的用于解决相似的问题而总结的使用经验,模式形成了强大的重用机制,可以让软件开发人员避免重复编写代码。第二,模式提供大量共用词汇。使用这些词汇软件开发人员可以在更高层上进行设计以与交流。第三,模式制约了解决方案空间。模式增加了问题解决方案空间的约束,也可以说是创造出了一个边界,设计以与实施必须在边界里面完成,否则就会对模式与设计损坏,导致意想不到的“反模式”。第四节框架框架是提取工程软件开发当中特定围软件具备相似属性的部份,框架是由一组联系紧密的classes(类)构成的,通过强调类相互的配合从而完成某种能够复用的设计概念。这些类相互之间以特定的方式合作。大多数框架的一般作用:因为是对特定领域软件具备相似属性部分的提取,所以在这一领域开发新的程序过程中能够不需要重新编写代码,只需要基于现有的框架进行进一步开发和整合就可以了;这样就能够提升软件质量,大大的降低本钱,而且节省很多时间,使开发软件越来越方便,效果越来越好,最后产生一种好的循环效果。框架不是可以直接利用的现成应用系统,因为框架仅仅是一个半成品,需要软件开发人员对它进行第二次发开从而达成具有具体功能的应用系统。框架并不是“平台”,由于平台这个概念较模糊,它可以是一种通讯中间件,一种应用服务器,一种数据库软件,一种操作系统,所以在应用平台当中中,平台主要责任就是供应特定服务系统软件。第五节架构软件系统架构一般具有两个要素:(1)架构是由总体到部份最高层次的划分的一个软件体系。一个体统一般是由元件组成,而这类元件怎么形成以与他们之间怎么产生作用,是关于系统自身构造的重要信息。更加详细的说,要包括任务流、架构元件、联结器。构架也就是系统核心的“砖瓦”,联结器才是对元件间通信机制、通信预想结果、通信途径很好的描述,任务流是对怎么运用这类元件来实现某项需要进行描述。(2)建立一个系统做出最高水平,在以后很难改变,商业与技术所决定。在构建系统之前要提前做出重要决定,如果系统已经开始了一个详细的设计或者构造,这些决定一般就无法更改了。因此,必须认真研究后再做出决定,这决定了设计成功与否。第六节框架与架构关系框架不是架构,架构决定了系统层次的区分、总体结构,不一样部份间的合作等设计思考。而框架比构架更加具体,更加侧重于技术。在确定框架之后,软件体系结构也随着确定了,对于同一个软件体系结构可以通过各种框架来实现。第七节框架与设计模式关系在软件设计当中框架与设计模式是不一样的钻研围。设计模式是对设计问题找出解决的方法,一个模式能够被各种框架以与被各类语言所实现;框架不仅是一种应用体系结构,而且是设计模式与代码的混合体。他们之间虽然有差别,然而都协同让设计者的代码能够复用,因此框架在思路里有着同样的特点,所以设计模式的想法能在框架设计中运用。框架与设计模式有着明显区分,原因主要体现在他们给出的容和致力的应用领域。(1)从容看,设计模式是一个简单的设计,这个设计可以有很多不同的语言,用不用的方式去实现;而框架是一种混合体由设计和代码组成,软件开发人员可以不扩展框架,从而形成完全不同的应用。(2)从应用来看,框架给出了全部应用体系结构;设计模式是给了一种简单的方案以解决设计问题,而且这个方案能在各种不一样的应用程序或框架当中进行使用。(3)以第一条为基础,可以看出设计模式相比框架更加容易移植;只要设计成形的框架,即使不构成一个完整的应用程序,但以此为基础进行的应用的开发会被框架的实现环境所制约;在这方面设计模式是和语言无关,因此能在更加广泛异构的环境中进行应用。框架是一个软件,设计模式则是软件的知识体,设计模式会对框架设计的水平进行提高。第三章系统开发环境技术介绍第一节MyEclipse介绍MyEclipse是一个功能强大支持也非常的普遍,用于开发JAVA、J2EE十分杰出的Eclipse的插件集合,对支持各类开源品特别的擅长。作为一个专门为Eclipse所设计和开发的插件集合,MyEclipse研发的初衷只是为了简化Eclipse的操作,为开发人员提供一个良好的操作界面和相对简单的操作方式。然而由于其开源性,在之后的各个版本中MyEclipse不断的得到了功能上的加强。到如今,MyEclipse10的功能可谓是相当巨大,它不但为Eclipse供应了大量的Java工具的集合,极大的处理了不同开源工具的不一样问题,同样也在自身集成了Tomcat,使得任务的发布不再需要事先绑定Tomcat,极大的简化了开发人员所需要安装的开发程序的数量。使得Java/JSP应用开发的效率得到了很大的提升。在结构上,MyEclipse的特征能够被分为七类:WEB开发工具、JavaEE项目部署服务、E开发工具、数据库服务、应用程序服务器的连接器、JavaEE模型、MyEclipse整合帮助。关于以上各类功能上的类别,在Eclipse中能够查找到相应作用的部件,而且通过一系列插件去完成它们。MyEclipse构造上的模块化,可以是我们对任何一个模块进行独自扩大与升级而且不影响其他模块。也就是说MyEclipse是Eclipse的插件,同时是一个功用十分巨大的JavaEE集成开发环境,它的主要作用是对代码进行编写、测试配置和除错。MyEclipse作为Java、J2EE的开发插件集合中一个十分优秀的插件集合,它有着十分强大的功能和广泛的应用支持面。它本身自带了非常完善的编码、调试、测试功能,在MyEclipse的最新版本MyEclipse10中,甚至集成了发布功能,能够不再依赖于Tomcat来进行程序发布。并且MyEclipse能够完美的支持Struts、JSP、JavaScript、Spring、SQL等程序。可以说,在Eclipse开发工具中,几乎包括了目前所有主流开源产品的MyEclipse毫无疑问的成为了最闪耀的一点星光。第二节MySQL数据库介绍作为当今计算机科学技术的一大分支,数据库成为了数据管理的最新技术,同时也为各式各样的信息管理系统提供了一个数据储存和交换修改的方式[7]。在如今的主流的网页开发和系统设计中,数据库的设计与实现已经成为了一个不可缺少的部分,它担当起了数据存储与维护的重任,是系统开发的灵魂部分。对于本系统而言,数据库用于存放学生的基础信息,是系统实现的基础部分。因此,数据库技术作为信息系统核心和基础得到愈来愈多的应用,从小型单项事务处理到大型信息系统(On-LineAnalysisProcessing,OLAP),从OLTP(OnlineTransactionProcessing,联机事务处理)到OLAP(On-LineAnalysisProcessing,联机分析处理);从一般企业管理到计算机辅助设计与制造(CAD/CAM)、计算机集成制造系统(CIMS)、电子政务(e-Government)、电子商务(e-Commerce)、地理信息系统(GIS)等[8],越来越多新的应用领域采用数据库技术来实现数据的储存和处理工作。作为一个关系型数据库管理系统,MySQL因为其开源性受到了广大程序员的青睐,其现属于Oracle公司。在Web应用开发方面MySQL是最好的关系类型数据库管理系统(RDBMS)应用软件之一,被广泛应用于各种各样的Web程序开发当中。MySQL是一种关联数据库管理系统,它将数据保存在不同的表中,而不是将各种各样的数据堆放在一起,通过表与表之间的关系来将数据连接在一起,这样就增加勒数据的处理速度,并且提高了灵活性[9]。MySQL在语言的选择上依旧采用了主流的SQL数据库标准化语言,这也使得其容易上手,并且编写相对规。MySQL最大的优势在于开放源码,使得其成为了一般中小型的开发首选。SQL语句介绍:作为是一种功能非常强大的数据库语言,SQL被译为结构查询语言,其英文全称为StructuredQueryLanguage。通常会被应用在一些大型数据库的建立之中。SQL语句一般用于完成数据的日常操作任务,例如在数据库中对数据进行插入、更新、删除,或者对数据库进行检索操作[10]。常见的使用SQL的关系数据库系统有:MySQL、Oracle、SQLsever2000、Sybase、DB2、MicrosoftSQLServer、Access等。在不同的数据库中,绝大多数的SQL结构化查询语言都是可以通用的,只有个别情况下会有一定差异。但是例如:“Select”、“Insert”、“Update”、“Delete”、“Drop”、“Create”等标准SQL命令,即使在不同数据库中也是没有差异的。SQL概括起来大概可以分为以下几个部分:(1)DCL(DataControlLanguage数据控制语言)通常被用于对用户的权限进行赋予和取消;(2)DDL(DataDefinitionLanguage数据定义语言)通常被用于数据结构的定义,如创建、修改、删除等命令;(3)DML(DataManipulationLanguage数据操作语言)通常被用于检索或者修改数据库中的已有数据;第四章框架研究第一节Struts2框架Struts2早先是ApacheJakarta项目构成成分,项目的先锋者想要改善与提升Servlet、JSP、标签库和面向对象技术水平,所以对此项目进行相信的研究。Struts2是建立在web的技术之上的一个MVC框架并不是完全独立出来的技术,脱离这些技术,Struts2框架也就不能运用了[11]。Struts2是Struts的升级品,Struts2框架是以struts1和WebWork的技术为基础进行了归并。其崭新的Struts2体系结构和Struts1体系结构大不一样。Struts2是以WebWork为核心,选用WebWork设计想法,而且选用拦截器的机制来解决客户要求,如此的设计也让业务逻辑控制器能够和ServletAPI彻底摆脱开,因此Struts2能够当成是WebWork更新之后的产物。虽然Struts1和Struts2有着十分大的改动,然而相对WebWork和Struts2改变倒是微不足道[12]。Struts2工作原理:首先客户端会发出一个要求,此要求可以通过多个过滤器最终到FilterDispatcher过滤器。然后FilterDispatcher会经过ActionMapper来判断此Request需求调用哪一个Action,如果需求调用的Action被寻找到,之前的请求处理就会被过滤器交给ActionProxy。然后ActionProxy会建立ActionInvocation实例,ActionInvocation此时会调用正确的Action,当然调用Action的过程当中会涉与到有关拦截器的调用。当Action执行完成,ActionInvocation会按照struts.xml中的配置找到对应的返回结果。第二节Spring框架Spring是一个开源框架,软件开发商为了解决企业应用开发的复杂性问题。利用基本的JavaBean来实现之前只可由E实现的工作,并且提供了许多企业应用的功能。但是,Spring用处不单限至于服务器端开发,从简约性、可测试性和松耦合的角度,每一个Java应用都能够从Spring当中得到好处。Spring不是专注于J2EE某一层的解决方法,而是寻找J2EE应用各层的解决方法。Spring为企业应用开发的“一站式”选取,Spring贯串持久层、业务层和表现层。但是,Spring不想代替现有的框架,而是以高度开放性与和他们完美联合。Spring框架是个分层构造,由七个定义优秀模块构成。如图4-1所示。AOP元数据与动态代理实现MVCAOP元数据与动态代理实现MVC框架Web上下文Web应用环境和工具类ORM支持Hibernate,JDO,iBatis,ToplinkSpring上下文Spring上下文校验,JNDI,Mail,任务等SpringDAO事务,DAO,JDBC核心容器核心容器Bean容器与支持工具图4-1Spring框架的7个模版构成Spring框架的每一个模块都可以单独使用,或与其他的一个或者多个模块共同使用,每一个模块功能如下。(1)核心容器:核心容器为Spring框架提供了最基本的功能。重要构件是BeanFactory,是以工厂形式来实现的,利用IoC模式将应用程序的配置与依赖性规和实际应用程序代码隔开。(2)Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。这些上下文包含企业服务。(3)AOP:通过配置管理功用模块,直接面向方面编程的功能集成到框架。因此,能够很轻易地利用Spring框架管理的任一个对象支持AOP。(4)SpringDAO:JDBCDAO抽象层供应了有实际意义的反常层次构造,我们可以使用该构造来管理异常办理和不正确的消息被不一样数据库供应商抛弃。异样层次构造简单化了错误处理,而且大大的降低了需求编写异常代码数目(例如开启和关闭连接)。(5)ORM:Spring框架为多个ORM框架,他提供了一个ORM对象关系的工具。(6)Web上下文:上下文模块提供了基于应用程序的上下文同时建在应用程序上下文模块的基础之上。因此Spring框架能够和JakartaStruts集成。该模块还简单化处理一般请求而且将要求参数绑定到域目标的工作。(7)MVC框架:MVC框架是构建Web应用程序功能齐全的MVC实现。经过计谋端口,框架包容了大批视图技术而变为高级可配置的。一般功能适用于不受制管理环境的影响,因此Spring框架功能能够在任何J2EE服务器中使用。Spring主旨是:支持没有绑定到指定J2EE服务并且可反复利用的业务和数据访问对象。第三节Hibernate框架Hibernate框架是一个数据访问框架(也叫持久层框架,可将实体对象成持久对象)通过Hibernate框架可以对数据库进行增删改查,为业务层构建一个持久层。可以使用它替代以前的JDBC访问数据[13]。Hibernate在对数据库进行访问的时候可以对数据库操作代码进行简化,并且Hibernate能够自动生成SQL,也可以把ResultSet所记录的以与实体类自动映射。Hibernate的API每一个数据库都可以执行,这是由于Hibernate的API当中并没有设计SQL的语句,数据库会根据Hibernate配置文件自动的生成相对应的SQL语句。Hibernate的任务就是负责是对JAVA对象与数据库表中数据之间的映射。Hibernate是现在一个比较流行的ORM(对象-关系映射)工具,当然目前也有许多其他的ORM工具,比如:MyBtis、JPA。Hibernate属于全自动类型,因此比MyBtis功能强一些(MyBatis只属于半自动)。但是全自动类型会有很多不确定而且无法控制的因素。第四节Java优点Java是解释执行的高级编程语言,他的特点是平台无关性、简单性、面向对象、健壮性、多线程、自动存管理。平台无关性是指Java语言平台无关,而Java的虚拟机却不是,需要下载对应平台JVM虚拟机的。自动存管理的意思是对临时存储的数据自动进行回收,释放存。如:引用类型的变量没有指向时,被回收;程序执行完成后,局部变量被回收。接下来主要介绍一下Java的优点。Java技术有下列优点:(1)简单:Java语言是面向对象语言,他只需要少些最基本的概念就能够很容易的写出各种情况下的应用并且他只需要供应基本方式去完成之前已经确定的任务。Java省去了运算号的重新载入以与多重继承不清楚观念,而且经过主动收取垃圾而极大的简单化了软件工作人员的管理存的工作。此外,Java特别适合在小型机子上运转,他的基本注释器和累的支撑大约只有40kb,如果再加上标准库以与线程支撑也就是大约有215kb。(2)面向对象:Java的设计主要是对象和他的端口,他供应了简易的机制与动态的端口模型。由于在对象当中封装了其变量和相对的方法,因此完成模块化与信息的隐蔽;对于类就有所不同了,类供应了一类对象原来的模型而且经过继承机制,父类提供的方法可以被子类使用,这就完成了代码的复用。(3)分布性:Java是一种面向网络的语言。经过它供给的类库能够办理TCP/IP协议,用户能够在网上很方便地访问其他对象,但需要经过URL地址。(4)鲁棒性:Java在编程的过程中要对可能出现的问题进行检测,认真改掉发生不对的地方。它提供自动垃圾收集来进行存管理,防止程序员在管理存时容易产生的错误。(5)安全性:既然要用于到网络,那么Java必须有可靠的安全性,必需阻止病毒侵入。Java一切部的访问都要经过对象的实例化去完成,因此对于指针是不支持的,这样就可以组织软件开发人员使用一些病毒木马等手法去访问独有的成员,这样也能够避免了在指针操作中的容易犯下的错误。(6)体系结构中立:Java就能够在任何处理器上运行,只需要安装Java运转系统。Java生成的字节在解释器得到他之后就会对他进行转换,这样就可以让他在不同的平台上运转。(7)可移植性:由于Java和平台没有关系的特征这样就可以使Java程序在网络上不同的机子间进行移植。与此同时Java数据库也能够与不同的平台接口实现。Java本身也可以移植,因为Java运行是系统是由C语言完成的。(8)解释执行:解释器直接对字节码注解,字节码自身携带了大量信息这样就使连接非常的容易。(9)高性能:Java字节设计很简单是自己转变成对应特定CPU机码,以此得到更高的性能。(10)动态性:Java的设计使得它适合于开发环境。在库中能够随意的添加新方法与变量也不会对用户程序实行产生任何的影响。第五章框架与数据库连接工具JDBC介绍为了实现应用程序对数据库的访问,SUN公司推出了JDBC(JavaDatabaseConnectivity,Java数据库连接),它由一些Java语言编写的类和界面组成,并且定义了Java语言与各种数据库之间的编程接口。JDBC为数据库的应用程序前台开发人员提供了一种标准的应用程序接口设计方法,开发人员可以通过使用纯粹的Java语言就完成对数据库应用程序的编写。只需要通过JDBCAPI编写一个程序就可以轻松的访问Oracle、Informix或者Sybase等各种各样的不尽一样的数据库。在JDK的包“java.sql.*”中定义了一系列的类、接口、异常等,以与与这些类和接口相关的属性和方法,而JSP的开发人员只需要按照固定的规则来调用封包中的API即可,这样就可以轻易的实现对DBMS的访问和操作了。JDBC同样被分为了3个主要部分,分别是:连接(Connection);语句(Statement);结果集(ResultSet);它的工作方式如下图所示:Servlet或JSP连接池DBMSServlet或JSP连接池DBMS线程1申请连接建立连接线程1申请连接建立连接用户1request释放连接用户1request释放连接管理链接连接池连接池连接池管理链接连接池连接池连接池线程2request线程2申请连接线程2request线程2申请连接用户2释放连接释放连接用户2释放连接释放连接图5-1JDBC工作方式图连接池连接池连接池连接池连接池连接池连接池连接池第二节连接池连接池的技术基本处于这样:一般对很多的应用程序在处理一般的事务通常只需要几毫秒就能完成,这时仅仅需要访问JDBC的一个连接线程。当没有事务需要处理的时候连接就会空闲下来,如果连接池空闲下来连接就能让别的线程使用。实际上当线程需要一个连接的时候,这时候就会从连接池中寻找一个连接。这个线程对于这个连接使用完成之后就会把他送回到连接池当中,回到连接池的连接就可以被其他的线程使用了。连接池可以极大的改善用户的Java应用程序的性能,同时减少全部资源的使用。连接池主要的优点有:(1)缩减创建的连接时间:和别的数据库相比较,虽然JDBC的功能相对于迅速,可是他要重新创立新的连接方式,这样就会加接时间和开销。对于连接可以循环使用的方法,就可以大大的避免浪费时间和开销的弊处。(2)编程模式得到简化:在使用连接池的时候,每个独立线程在操作的时候犹如创立了一个自身JDBC连接,用户可以直接使用编程技术。(3)资源的利用会受控制:当使用者不需要连接池的时候,而在线程需要一个连接,那么程序只能为此创建一个新的连接,使用用户应用资源的时候就会产生十分高的浪费甚至导致由于过载而产生异常。我们们可以了解到,JDBC连接不管是在客户端还是在服务器都会产生花费。而且每一个连接都会对其程序和服务器的资源产生一些影响与限制。这些连接无论是否在做有用功都会使用资源。而连接池不会有这些问题,他会将性能的使用最大化,而且他还会控制资源的利用使之在一定的围之,假如超过了这个围应用程序就不仅是变慢了而是直接崩溃。数据库连接池的主要操作如下:(1)创建数据库连接池的对象。(2)根据先前指定的参数创立初始数目的数据库连接(即闲置连接数)。(3)如过有数据库的访问请求,此时会从连接池中找到连接,如果连接池中没有闲置连接并且连接并没有到达最大的数量(也就是所说的最大活跃连接数),此时就要创立一个全新的连接了。(4)存取数据库。(5)关闭数据库,对各数据库的连接释放(关闭数据库连接,这不是真正关闭,而是放入空闲队列。如过实际空闲连接数大于初始空闲连接数的时,连接就会被释放)。(6)在服务器维护或者停止的时段,要释放数据库连接池中的对象以与所有连接。第三节几种常见的连接池一、ODBCODBC其实就是开放式数据库,是由微软公司提出来的一种使用SQL应用程序接口。用户能够增加数据库驱动,将自己的程序连接到自己建立的数据库系统当中,ODBC的优势其实就是以统一方式处理全部数据库,而他自己程序与数据库没有关系。在结构上区分ODBC分为两种,单束式和多束式。单束式:单束式驱动程序类似中介驱动程序数据提供统一的一个数据访问方法,并且单束式驱动程序在应用程序与数据库之中[15]。有用户对数据库进行访问操作的时候,应用程序会给ODBC管理器传递一个ODBC的函数让其调用。之后会让ODBCAPI进行正确的判别是由谁来办理,由自己直接办理且返回结果还是交给驱动程序处理后返回结果。我们可以看出,单束式驱动程序自身就是数据库引擎,单束式驱动程序可以直接对数据库完成操作,虽然此数据库可以在网络的任意的一个地方。多束式:多束式驱动程序自身不实行任何的数据操作而是用作网络通信协议的一个界面的远程操作。多束式驱动程序主要负责的是在程序与数据库引擎之间传达指令与数据。如果应用程序对数据库处理提出要求,那么该请求就会发给ODBC管理器,当ODBC管理器根据请求当场实现,如果不行就会转给多束式驱动程序,此时多束式驱动程序会把请求编译成数据库通信借口能够明白的方式并且把且该请求交给借口去解决。之后接口会把这个请求通过网络传给服务器数据引擎,当服务器解决好这个请求之后会把结果传给数据库通信接口,这时通信接口回把最后的结果发给多束式驱动程序,由多束式驱动程序发给应用程序。二、C3P0连接池C3P0是一个开源的JDBC连接池,当前使用它的开源项目有Hibernate,Spring。C3P0与DBCP的区别:C3P0与DBCP的最大的区别就是有无自动回收空闲连接的功能,DBCP没有此项功能是而C3P0是有的。C3P0与一般的POOL是相似的,要对数据库连接池进行管理都是要靠阻塞机制的,如果连接池当中没有能用的connection则就会被阻塞,通常是经过wait(),等到连接池中有可用的connection,这时候就会经过notify()唤醒[10]。使用C3P0有三种方式:(1)直接初始化与配置ComboPooledDataSourceBean;(2)使用DataSourcesFactory;(3)经过PoolBackedDataSource并设立ConectionPoolDataSource来创建。最常用的是第一种。不管用什么方式得到DataSource,C3P0都会供应一个叫做perties的文件以此去配置此数据源。三、TustCP连接池TustCP是对已有的连接池进行研究学习的基础之上,自己所编写的一个简单的连接池。具体代码如下:.tust.ConnectionPool;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.util.LinkedList;//定义公开类TustCPpublicclassTustCP{//定义MySQL数据库urlprivatestaticStringurl="jdbc:mysql://:3306/lml";//数据库IDprivatestaticStringusername="root";//数据库密码privatestaticStringpassword="10112106";//建立一个新的双向循环链表privatestaticLinkedListTustDataSource=newLinkedList(); privatestaticintmaxconnection=20; static{ try{//加载MySQL数据库的驱动类Class.forName(".mysql.jdbc.Driver"); }catch(ClassNotFoundExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } for(inti=0;i<maxconnection;i++){ try{//建立与远程数据库的连接Connectionconn=DriverManager.getConnection(url,username,password); TustDataSource.addLast(conn);//如果驱动类加载失败,将捕获异常 }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }//把链表中的第一个节点移动到链表结尾publicstaticConnectiongetConnection(){ return (Connection)TustDataSource.removeFirst(); } publicstaticvoidputConnection(Connectionconn){ TustDataSource.addLast(conn); }}第六章建立数据库本文是对基于反射机制框架进行研究,所以数据库在本文中只起到一个检验框架正确性的作用。因此在本文只需要建立一个简单的数据库。第一节数据库表的结构数据库表的结构如下图:一个“学生”表student表6-1学生信息表字段类型长度备注Snochar9学号Snamechar20Ssexchar2性别Sagesmallint年龄Sdeptchar20所在系第二节创建数据库部分代码与结果一、创建数据库代码部分:createdatabaselml;showdatabases;结果如图:图6-1已创建lml数据库代码部分:uselml;Createtablestudent(Snochar(9)primarykey,/*Sno是主码*/Snamechar(20)unique,/*Sname取唯一值*/Ssexchar(2),Sagesmallint,Sdeptchar(20));结果如图:图6-2创建表数据输入之后“学生”表student创建成功如图:图6-3学生表student第七章基于反射机制框架的设计与实现Spring中AOP就是基于反射机制来实现的,在这里我们举个例子来说明一下AOP其中的一个功能。假如有一个日志的请求,利用AOP我们就可以不用修改程序中任何的代码,就能够将这个请求加到原来的程序当中,当然如果你想把这个日志删除掉也同样不用修改任何的程序。这个AOP功能是对反射机制的完美应用。在本文中我根据反射机制,参考AOP框架实现一个轻量级的框架。第一节框架的总体设计图7-1反射机制框架包结构反射机制框架使用MyEclipse10开发完成,如图7-1所示,反射机制框架一共分为2个包。在.tust.Call这个包中,Advice.java与Tustcpcallinterface.java是程序中两个接口,而MyAdvice.java与Tustcpcall.java分别是对Advice.java与Tustcpcallinterface.java这两个接口的实现方法。第二节具体代码介绍一般来说Adcive这个接口有四个方法,在异常里面执行的方法、在方法之前执行的方法、在方法之后执行的方法以与在方法前后执行的方法。这里我只给出在方法之前和在方法之后执行的两种方法。代码下:.tust.Call;importjava.lang.reflect.Method;publicinterfaceAdvice{ voidbeforeMethod(Methodmethod); voidafterMethod(Methodmethod);}MyAdvice.java对Advice.java接口的实现代码如下:.tust.Call;importjava.lang.reflect.Method;publicclassMyAdviceimplementsAdvice{ longbeginTime=0; publicvoidafterMethod(Methodmethod){ //TODOAuto-generatedmethodstubSystem.out.println("TUSTCP连接完成!"); longendTime=System.currentTimeMillis(); System.out.println(method.getName()+"runningtimeof"+(endTime-beginTime)); } publicvoidbeforeMethod(Methodmethod){ //TODOAuto-generatedmethodstub System.out.println("TUSTCP连接开始!"); beginTime=System.currentTimeMillis(); }}这个代码的功能是计算TustCP连接池在连接数据库时所需要的时间。Tustcpcall.java是对Tustcpcallinterface.java这个接口的实现。代码的功能就是返回到TustCP类代码如下:.tust.Call;importjava.sql.Connection;.tust.ConnectionPool.TustCP;publicclassTustcpcallclassimplementsTustcpcallinterface{ publicConnectiongetConnection(){ returnTustCP.getConnection(); }}现在我们写一个方法用到上面的两个功能。在这个方法中与运用上面两种方法就是通过共同的借口来实现的。代码如下:privateTustcpcallinterfacecurrentgetConnection(){ finalTustcpcallclasstarget=newTustcpcallclass(); finalAdviceadvice=newMyAdvice();Objectproxy3=Proxy.newProxyInstance(//新创建一个实例;target.getClass().getClassLoader(),//类加裁器/*newClass[]{Collection.class},*/target.getClass().getInterfaces(),//要实现的接口;newInvocationHandler(){publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ /*longbeginTime=System.currentTimeMillis(); ObjectretVal=method.invoke(target,args); longendTime=System.currentTimeMillis(); System.out.println(method.getName()+"runningtimeof"+(endTime-beginTime)); returnretVal;*/ advice.beforeMethod(method);//执行它的beforeMethod方法;ObjectretVal=method.invoke(target,args);//调用方法;advice.afterMethod(method);//执行它的afterMethod方法;returnretVal; }上述的这个方法就是利用了反射的机制的原理,这个方法可以封装起来,里面的容任何时候都不用修改,如果实现的方法有所改变或者想使用一个新的连接池(在本文中指TustCP连接池)的时候只需要修改MyAdvice.java与Tustcpcall.java里面的程序即可。这就是反射机制的优势,可以在方法之外修改所要实现的方法,而一般的方法没有这个功能。第三节代码测试现在我们测试上述代码的是否可行,在本文中对自己所写的反射机制框架进行了扩展,设计出完成的java文件ConnectionGetandClose.Java。这个设计的功能是用来选择哪种连接方式对客户端和数据库进行连接。程序中给出了3中连接方式,JDBC、C3P0、和TustCP。如果选择TustCP就可以对我们所设计的方法进行检验。代码如下:.tust.ConnectionPool;importjava.beans.PropertyVetoException;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;importjava.sql.Connection;importjava.sql.DriverManager;importjavax.servlet..ServletRequest;importjavax.servlet..Session;importorg.apache.struts2.ServletActionContext;.tust.Call.Advice;.tust.Call.MyAdvice;.tust.Call.Tustcpcallclass;.tust.Call.Tustcpcallinterface;import.mchange.v2.c3p0boPooledDataSource;publicclassConnectionGetandClose{ privatestaticServletRequestrequest; privatestaticSessionsession; privateStringselectedconnection; privatestaticComboPooledDataSourceC3P0datasource=newComboPooledDataSource(); static{ request=ServletActionContext.getRequest(); session=request.getSession(); C3P0datasource.setJdbcUrl("jdbc:mysql://:3306/lml"); C3P0datasource.setUser("root"); C3P0datasource.setPassword("10112106"); try{ C3P0datasource.setDriverClass(".mysql.jdbc.Driver"); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } publicConnectiongetConnection()throwsException{ Class.forName(".mysql.jdbc.Driver"); selectedconnection=(String)session.getAttribute("selectedconnection"); if("JDBC".equals(selectedconnection)){ Class.forName(".mysql.jdbc.Driver"); returnDriverManager.getConnection("jdbc:mysql://:3306/lml","root","10112106");} elseif("C3P0".equals(selectedconnection)){ returnC3P0datasource.getConnection(); } elseif("TUSTCP".equals(selectedconnection)){ //returnTustCP.getConnection(); returncurrentgetConnection().getConnection(); } else thrownewException("无此连接"); } privateTustcpcallinterfacecurrentgetConnection(){ finalTustcpcallclasstarget=newTustcpcallclass(); finalAdviceadvice=newMyAdvice(); Objectproxy3=Proxy.newProxyInstance(//新创建一个实例; target.getClass().getClassLoader(),//类加裁器 /*newClass[]{Collection.class},*/ target.getClass().getInterfaces(),//要实现的接口; newInvocationHandler(){ publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ /*longbeginTime=System.currentTimeMillis(); ObjectretVal=method.invoke(target,args); longendTime=System.currentTimeMillis(); System.out.println(method.getName()+"runningtimeof"+(endTime-beginTime)); returnretVal;*/ advice.beforeMethod(method);//执行它的beforeMethod方法; ObjectretVal=method.invoke(target,args);//调用方法; advice.afterMethod(method);//执行它的afterMethod方法; returnretVal; } } ); return(Tustcpcallinterface)proxy3; } publicvoidcloseConnection(Connectionconn)throwsException{ selectedconnection=(String)session.getAttribute("selectedconnection"); if("JDBC".equals(selectedconnection)) conn.close(); elseif("C3P0".equals(selectedconnection)){ conn.close(); } elseif("TUSTCP".equals(selectedconnection)){ TustCP.putConnection(conn); } else thrownewException("无此连接"); }}ConnectionName.java文件是对连接数据库成功之后数据库容的显示。Selectedconnection即表示选择的方式。具体代码如下:.tust.ConnectionPool;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importjavax.servlet..ServletRequest;importjavax.servlet..Session;importorg.apache.struts2.ServletActionContext;publicclassConnectionName{ privateStringselectedconnection; privatestaticServletRequestrequest; privatestaticSessionsession; privatestaticConnectionGetandCloseconnectionutil=newConnectionGetandClose(); publicStringgetSelectedconnection(){ returnselectedconnection; } publicvoidsetSelectedconnection(Stringselectedconnection){ this.selectedconnection=selectedconnection; } publicStringfind_name()throwsException{ System.out.println(selectedconnection); request=ServletActionContext.getRequest(); session=request.getSession(); session.setAttribute("selectedconnection",selectedconnection); Connectionconn=connectionutil.getConnection(); Statementst=conn.createStatement(); ResultSetrs=st.executeQuery("select*fromstudent"); System.out.println("开始输出数据"); while(rs.next()){ System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t"); } System.out.println("数据输出完成"); rs.close(); st.close(); connectionutil.closeConnection(conn); return"success"; }}Web.xml文件是对下面jsp文件转换成struts2,具体代码如下:<?xmlversion="1.0"encoding="UTF-8"?><web-app> <filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>struts.xml文件为当网页登录之后所需要显示的页面容,本程序就是执行Index.jsp文件。具体代码如下:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC "-//ApacheSoftwareFoundation//DTDStruts

温馨提示

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

评论

0/150

提交评论