




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉纺织大学2010届毕业设计论文1 概述1.1 课题背景随着IT技术和互联网应用的蓬勃发展,类似Blog、BBS等类型的个人型网站的需求量也越来越大。新浪、搜狐、腾讯等各大门户网站也纷纷推出了自己的Blog、BBS等应用。但这些门户网站推出的应用都是依赖于其母网站而存在的,自由性肯定会受到限制,完全设计自己的界面和定制特定的功能基本上不可能。所以在这种环境下,很多站长选择自己来开发完全属于自己的网站。目前可供选择的建站技术也越来越多,如Ruby的Rails框架和Python的Django框架极大的提高了建站效率,降低了建站的技术门槛。而PHP的各种开源系统,如:WordPress、PHPWind等更是使建站逐渐脱离编程技术范畴,点点鼠标即可完成一个优秀网站的开发。随着Ruby、Python、PHP这些动态语言的崛起,曾经Web界中的主流开发技术 Java却因为其低下的开发效率而逐渐显露出了疲态。Java语言本身为程序员提供的帮助只有两点:一是语法,二是内置类库。而现在Java Web方面的开发大多是依赖第三方类库。所以,与其说Java在Web方面开发低效,倒不如说是Java采用第三方类库开发比较低效。但是Java相对于目前流行的动态语言在性能上有着绝对的优势,PHP、Ruby、Python、Java在执行速度上的比例是:1:2:4:100,也就是说Java的执行速度大概是PHP的100倍,是Ruby的50倍,是Python的25倍。所以Java提高在Web方面的开发效率,是很多个人站长所希望看到的。1.1.1 Java Web框架的现状 Java在Web方面的开发框架多如牛毛。如最流行的SSH(Struts、Spring、Hibernate),还有同样流行的iBatis、WebWork、Seam等各式各样的MVC、ORM、IOC框架1。而国内也不乏SpringSide、Jdon这样把MVC、ORM、IOC整合在一起的优秀的企业级开发框架。这些框架中有最优秀的设计思想,最优秀的设计模式,也不缺乏各种成功的大型商业案例2。但是它们对于类似Blog、BBS这样的个人型网站来说,太重量级,学习曲线也非常高。并且每一个框架中包含的Jar文件基本都是10MB左右,而开发一个网站往往需要使用到多个框架,那么使用到的Jar文件可能会有几十上百MB,这对个人服务器的空间会造成很大的压力。所以这些框架对于个人小型网站不太适合。1.2 课题内容分析目前各种个人小型网站的主要功能和需求。学习Rails,Django等快速开发框架的技术特点。运用Java技术开发出一套小巧、易用、开发迅速的Web框架。框架主要实现MVC、DAO、IOC、JSON等多个常用功能。并对开发人员平时可能用到的操作进行封装,使开发人员开发时更少的直接接触Java API。而框架内部所使用到的通用操作,皆由框架内部工具类提供,不采用任何第三方组件,并隐藏内部工具类的接口,以降低开发人员的学习曲线和框架API的复杂性。1.3 课题目的和意义 课题目的:通过对个人小型网站的功能、需求分析,和对当前主流开发技术的学习。充分发挥Java的高性能的优势,为小型网站站长提供一个技术门槛低,且能够快速开发出高性能的个人网站的框架。课题意义:个人建站已经越来越流行,目前的主要建站技术PHP、Ruby On Rails、Django On Python虽然开发迅速,但是性能不够理想。而Java的性能非常优秀但其常见的Web开发框架效率却非常低下。一门语言的性能不能通过编码来大幅度的提升,但是开发效率却可以通过框架的封装来提高。所以Java的快速开发框架可以在保证性能的同时,极大的提升开发效率,让个人小型网站不但开发迅速,而且能够承受更大的访问压力。为现在个人建站潮流注入新的活力。2 系统分析2.1 可行性分析2.1.1 技术可行性本框架采用Java技术来实现。使用Eclipse作为开发工具,整个项目用Maven和SVN完成项目管理和版本控制。Java和Eclipse是平时最常使用的开发语言和IDE,所以很熟悉;而SVN在团队开发中使用的次数也较多,并且Eclipse有插件对其支持,使用起来非常简单;由于只使用到Maven的插件管理、编译、打包等入门级功能,所以使用Maven也不存在技术问题。而对于一些流行的框架如:Struts、Hibernate、Spring和Ruby的Rails框架,由于平时使用的非常多,对它们的设计思想,大致实现过程也有一定的了解,可以从这些框架中吸取相应的优点。使用的Web应用服务器是Tomcat,由于平时一般开发的都是Java Web项目,而使用的服务器都是Tomcat,所以使用和配置Tomcat也完全没有技术上的难点。数据库则采用的是MySQL和HSQLDB数据库,MySQL数据库使用的非常多,而HSQLDB是一个微型的嵌入式数据库,非常简单,一般用于测试。在数据库方面也不存在技术难点。所以在技术上是完全可行的。2.1.2 经济可行性实现本框架所采用的开发环境, 插件均是免费的;而数据库服务器,Web应用服务器也都是开源的;开发过程中使用的计算机是自己的个人电脑,不需要另外租用,所以不需要花费额外的费用。框架采用的JDK版本是较新的JDK1.6,并且由于JDK的向后兼容的特性,所以不存在短时间内被淘汰和升级JDK后不兼容的情况,用户对框架的的要求也是一直存在的。所以经济上完全可行。2.1.3 社会可行性由于本框架是完全自行开发,并且开源,所以不存在法律上版本和专利的争议。本框架可以使用在任何小型的使用Java Web开发的网站中。由于Java的跨平台性,本框架可以运行在任何操作系统和服务器上。如果需要在Windows操作系统下使用,那么请购买正版Windows操作系统。因为本框架是用来开发B/S结构的系统,需要网络,但一旦服务器连接到Internet上,它的操作系统可能会被Microsoft跟踪,如果不是正版软件,将不得不面临民事诉讼的风险。2.1.4 用户使用可行性本框架的特色之一就是简单易用,只需要了解简单的Java建站的技术,就可以很方便的采用它来快速的开发出一个小型个人网站。并且对J2EE中的很多难点进行了屏蔽、封装,对一些常用的功能也提供了工具类,使开发者不需要掌握J2EE相关知识就能够进行Java Web的开发,所以在用户使用方面是可行的。2.2 需求分析2.2.1 详细调查经过调查了解,现在越来越多的人都希望开发完全属于自己的小型网站。而很多个人站长都选择了PHP、Ruby On Rails、Django On Python等各种动态语言开发技术。因为动态语言学习曲线较低,而且开发效率高,开发成本低。能够很快的开发出满足自己需求的优秀的网站。并且当需求改变,需要修改网站的功能时,由于动态语言的特性,只需要修改相应的代码文件,然后刷新页面,修改后的效果就会立即呈现出来,非常快捷、方便。动态语言的高开发效率必定会带来性能上的低下3。的确PHP、Ruby、Python在处理较大并发访问时容易出现内存溢出等问题;而动态语言每次运行都需要加载源代码文件的这个特性,虽然提供了修改源代码后可以立即显示出改动后效果的便利,但同时也造成了运行速度慢的问题4。并且Ruby、Python并没有真正的多线程技术,它们中的线程都是基于虚拟机的伪线程而实现的,这样就会使Ruby、Python不能完全的利用CPU的资源。所以很多小型网站站长为了确保用户访问的畅通性,不得不花费额外的费用来升级服务器硬件5。Java是一门优秀的语言,执行速度较快,完全面向对象,并且在十几年的飞速发展中不乏各式各样成功的商业应用案例,对于各种问题也有丰富的解决方案和组件类库。但是在个人小型网站这个越来越广阔的市场中,Java所占的份额却越来越少。这是因为下面三个主要的原因:(1)Java学习曲线较高:首先要学习J2SE中的基础知识,然后要学习JSP、Servlet、JDBC的相关知识,最后还可能需要学习Struts、Hibernate、Spring、iBatis、Wicket等各种框架。(2)Java的开发周期较长:Struts、Hibernate、Spring都需要大量的配置,而这些配置只要错了一个地方,整个项目就无法启动,所以开发过程中需要时刻注意。而Java静态语言的特性也决定了Java不可能像动态语言那么灵活、敏捷,所以使用Java来开发网站的速度较慢,开发周期较长6。(3)第三方类库对服务器的空间造成了压力:Java的开源类库非常丰富,很多类库都是依赖于其它类库,而类库之间的互相依赖就造成只使用Hibernate却需要引入十几MB,甚至几十MB的其它类库文件的问题。这些类库文件会给小型网站的服务器空间造成很大的压力。 而Grosbeak正是为了解决上面问题而诞生的一个用于开发Java Web的开源框架。因为它采用Java技术实现,所以在性能上是完全信得过的。并且Grosbeak框架对Servlet、JDBC等技术的接口进行了屏蔽和封装,使用户不需要再学习Servlet、JDBC等相关知识,只需要了解框架本身的API就可以进行网站的开发,降低了学习难度。框架封装了MVC、DAO、IOC、JSON等多种常用功能,并为用户提供了大量的反射,字符串,格式化等多方面的小工具类,使开发更加迅速。虽然Grosbeak提供的功能非常多,但却没有依赖于任何第三方插件,并且框架的大小也只有243KB,对服务器的空间不会造成压力。2.2.2 功能分析Grosbeak框架是一套完整的开发框架,包括开发过程中所用到的各项主要功能及对一些常用操作的封装,使用户不需要了解其它第三方组件的API就可以完成一个网站的开发。框架主要包括如下功能:MVC:主要实现MODEL2架构,并扮演Controller的角色,对Servlet的原始接口进行了封装和屏蔽。接受客户端的请求,然后把请求内容分发给相应的Model来处理,最后把处理后的结果反馈给View(框架默认的View是JSP,当然也可以实现相关的接口来使用FreeMaker、Velocity等模板渲染引擎作为View)进行展示。DAO:主要提供对数据库进行操作的接口并对JDBC的原始接口进行封装和屏蔽。框架中提供的数据库操作接口把数据库表映射到实体类,使对数据库的操作面向对象化,并简化增、删、改、查操作。但是并没有像Hibernate那样鼓励屏蔽SQL使用HQL,而是鼓励使用SQL,因为直接执行原始的SQL语句能够提高效率。IOC:依赖控制反转容器,主要用来管理所有的类和对象。并对单例对象进行了缓存,以提高性能。还提供了“Hook(钩子、回调)”功能,可以对容器中的对象进行筛选,筛选过程是在第一次加载IOC配置文件时进行的,并且只筛选一次,不会对运行中的系统有性能上的影响。JSON:JSON解析器,主要完成Java对象和JSON字符串之间进行序列化与反序列化功能。Lang:一系列的工具类,以提高用户的开发速度。对Java中的反射机制、字符串、文件流实现了封装,使用户基本感觉不到Java是一门静态语言。Castor:转换器,用来完成Java不同类型之间的转换功能。框架内置多种常用的转换器,这些默认转换器基本可以满足一般需求。如果有特殊的转换需求,也可以在IOC中加入自定义的转换器,Castor会自动识别,并将其加入到默认转换器中。Logger:主要完成日志记录功能,框架中默认的日志记录是通过System.out.print进行输出。但是对JDK的Logger和Log4j都提供支持。Logger优先采用Log4j完成日志功能,如果没有Log4j则采用JDK自带的Logger,如果还没有Logger,则采用框架默认的日志实现类。2.3组件依赖分析Grosbeak是由多个功能组件组合而成,而这些组件也可以单独使用,但是组件之间存在一定的依赖关系。例如:使用MVC功能组件时就必须把Lang功能组件添加到CLASSPATH中,因为MVC功能组件中的部分功能的实现是依赖于Lang功能组件的。详细的组件包之间依赖关系如表2-3所示:表2-3 组件包依赖关系表包名描述依赖org.atlantis.grosbeak.cable.*MVC框架,并提供Controller功能lang、depotorg.atlantis.grosbeak.castor.*对象类型转换框架langorg.atlantis.grosbeak.depot.*IOC容器框架lang、jsonorg.atlantis.grosbeak.json.*JSON解析组件langorg.atlantis.grosbeak.lang.*常用工具类组件无org.atlantis.grosbeak.logger.*日志记录组件lang、pluginorg.atlantis.grosbeak.plugin.*插件机制组件depotorg.atlantis.grosbeak.pot.*DAO持久化框架,简化数据库操作lang、depot2.4请求流程分析从用户通过浏览器发起请求到返回处理结果给用户的流程如图2-4所示:图2-4 请求流程图3 框架设计3.1 技术设计框架的开发技术采用Java语言,因为Java的性能非常优秀、完全面向对象,并且在Web方面的开发案例非常丰富。只是由于它学习成本高,开发周期长,最近4年受到动态语言的强烈冲击,所以才在小型网站开发领域显露疲态,而Grosbeak框架正是为了解决上面的问题而诞生的。所以框架采用Java作为开发语言。软件测试是保障软件质量的重要手段,随着软件开发规模的增大、复杂程度的增加,寻找软件中的错误的测试工作也更加麻烦。单元测试的主要功能是验证代码的功能和异常处理情况的能力。Grosbeak框架在测试方面,采用JUnit4进行完全自动化测试。JUnit是一个针对Java的优秀的单元测试框架,甚至可以说是Java开发领域进行单元测试的一个事实上的标准。很多主流Java开发环境直接提供了JUnit单元测试的支持,如Eclipse、JBuilder和NetBeans等。而类似Maven、Ant这样的项目管理软件对JUnit的支持也非常完美。并且在Junit的基础上有很多新的单元测试扩展框架,如StrutsTest是专用于测试Struts应用的测试扩展,HttpUnit是专用于测试HTML代码的测试扩展,punit是对代码的内存、CPU资源占用,多线程并发性进行测试的测试扩展。在数据库方面Grosbeak框架默认只采用了两种数据库:MySQL、HSQLDB进行支持和测试。因为小型网站一般不会采用类似Oracle、DB2这样的大型关系型数据库。但是如果需要使用到其它的数据库,完全可以通过实现指定接口来达到需求。(1)MySQL是很多小型网站的首选数据库,它的是目前速度最快的数据库之一。还精简了一些不必要或不常用的功能,这对于中小型企业并没有大的影响,却得到了速度上的提升。MySQL相对于Oracle、DB2等大型数据库的复杂设置和管理,MySQL非常简单高效,一般的开发人员稍加学习就很容易管理好一个MySQL。MySQL的跨平台性也非常优秀,支持各种常见的操作系统,如:Windows、Unix、Linux等。可以方便的将数据库从一个服务器迁移到另外一个服务器,而数据和应用都不需要再做修改。MySQL还支持网络应用,开发人员可以通过网络来访问MySQL的数据库,通过Internet对MySQL中的数据进行操作。(2)而HSQLDB是一款比MySQL更微型,完全由Java编写的轻量级数据库。体积非常小,仅有一个693KB的hsqldb.jar文件就包括了数据库引擎,数据库驱动和用户界面等内容。虽然体积小,但是仍然具备一般数据库的特性,如:对JDBC的支持、具有多种数据库工作模式(内存,服务,文件系统)、支持事务处理、允许表管理、完整性引用和约束、支持储存过程和函数、数据库可以生成SQL脚本、使用用户名和密码、访问权限等安全机制等,使得它作为数据库或持久化引擎广泛应用在许多开源的项目中。由于HSQLDB具有嵌入式数据库的特性,所以它是Grosbeak框架用来测试DAO通用功能的首选数据库。整个项目采用Maven进行管理。因为虽然开发工具Eclipse可以自动编译源文件,但是测试、打包、部署、生成API文档等众多工作却需要手动完成。而Maven可以自动完成编译、测试、打包等一系列的工作。只要有特定的Maven插件,它可以完成软件开发生命周期中的所有任务。例如使用mvn site可以快速生成项目站点,Apache很多开源项目站点都是采用Maven生成的。而且Maven对JUnit、EMMA都提供了很好的插件支持,能够很方便的进行测试和直接生成测试覆盖率的报告。而使用Maven进行项目管理的最重要的一个原因就是Maven能够对项目中使用到的Jar文件进行管理。虽然Grosbeak不需要任何第三方组件,但是在项目的编译期却需要servlet-api.jar等类库的支持,在测试期需要junit-4.7.jar等类库的支持。Maven可以帮助管理这些第三方类库的版本和依赖,如下面是配置JUnit-4.7.jar依赖的一个片段:junitjunit4.7并且Maven会通过pom.xml管理jar文件之间的相互依赖。例如上面的junit-4.7.jar的同级目录会有一个junit-4.7.pom文件,在这个pom文件中指定了junit-4.7.jar对其它类库的依赖。执行Maven相关命令就会自动下载到junit-4.7.jar所依赖的其它类库,非常方便。3.2 功能结构设计框架是一个系统全部或者部分的可复用性设计,表现为一组抽象类及它们实例之间的相互作用方式。既然框架可以定义为在一个领域内一个应用程序的部分设计和实现,那么从某种意义上而言框架是一个不完整的系统,这个系统可以被定制用于创建完整的应用。Grosbeak就是将小型网站开发这个领域中相同类型问题的解决方案进行抽象,再把抽象出来的结果封装成一个个功能的,从而减少构建相同应用程序时的代价。3.2.1 MVC功能结构设计在Grosbeak框架中实现MVC功能的具体包是:org.atlantis.grosbeak.cable。cable中文翻译是“电缆”,意为cable是在客户端和逻辑模型之间传递信息的,作为“Controller(控制器)”来使用。所有在Web方面的开发人员对于MVC肯定不会陌生,它是Web应用中当前最常用的设计模式,它减弱了业务逻辑接口和数据接口之间的耦合,可以让视图层更富于变化7。通常MVC设计模式把一个系统划分为相互协作的三个部分:(1)Controller(控制器):控制器接受来自视图的请求,修改模型的状态。(2)Model(模型):模型用于封装系统的状态,比如业务数据。(3)View(视图):视图是模型的表示,提供用户交互界面。当模型状态发生变化时,视图应该得到通知,以便更新模型的变化8。MVC模式的示例图如图3-2-1-1所示:图3-2-1-1 MVC模式示例图Grosbeak框架中的MVC继承了MVC Model2的各项特性,并根据小型网站开发的特点,做了相应的变化与扩展。Grosbeak中的MVC基本工作原理如图3-2-1-2所示:图3-2-1-2 Grosbeak框架的MVC原理图详细的执行流程是:首先当服务器容器启动时运行CableInitContext初始化引擎,CableInitContext是一个ServletContextListener实现类,它会从IOC容器中获取所需的各种初始化对象,如拦截器、转换器等。然后当一个客户端请求(user/login)经过CableDispatcherFilter过滤时,CableDispatcherFileter会把请求转发给Postman分发器,而Postman首先解析这个请求的URI,再执行相关的拦截器,然后找到声明了ActionBean(“user”)注解的Action类,并执行该类中声明了ActionMethod(“login”)的方法,然后获得方法的返回结果,再次执行拦截器,然后根据方法的返回结果来决定如何展现视图。执行流程的示例图如图3-2-1-3所示:图3-2-1-3 执行流程图Grosbeak中的MVC功能会对URL进行重写。使访问URL中不会含有“&”、“?”等字符,使URL更加干净、整洁。如表3-2-1-1所示是URL经过重写后的多个例子:表3-2-1-1 URL重写示例表重写前的链接重写后的链接说明http:/localhost:8080/userServlet?action=login&username=seenoevil&password=123http:/localhost:8080/user/login/username/123用户登陆http:/localhost:8080/userServlet?action=show&id=3http:/localhost:8080/user/show/3显示用户信息http:/localhost:8080/userServlet?action=listhttp:/localhost:8080/user/list显示所有用户http:/localhost:8080/topicServlet?action=indexhttp:/localhost:8080/topic显示论坛模块的主页http:/localhost:8080/topicServlet?action=topic&control=page&number=3http:/localhost:8080/topic/page/3显示论坛模块第3页的所有帖子http:/localhost:8080/indexServlet?action=homehttp:/localhost:8080/显示主页虽然有很多第三方组件或者Apache服务器经过配置都可以完成URL重写的功能16,但是Grosbeak框架为了减少用户学习的门槛,所以默认就直接实现并采用URL重写。目前Grosbeak不允许采用类似“*.do?action=*&*”的URL格式,所有的URL都必须经过重写。 Grosbeak框架中的MVC默认支持的视图是JSP。但是同样可以支持如FreeMaker、Velocity等各种模板渲染引擎作为视图17,只要实现了框架提供的org.atlantis.grosbeak.cable.template.Template接口即可。而框架内部也提供了多种常用的视图实现,如表3-2-1-2所示:表3-2-1-2 Grosbeak框架内置模板表类全名说明org.atlantis.grosbeak.cable.template.BinaryTemplate用来渲染一段字节的模板。通常是用于文件下载。响应content-type:application/octet-streamorg.atlantis.grosbeak.cable.template.FileTemplate用来渲染一个文件对象(File)。也是用于文件下载。响应content-type:application/octet-streamorg.atlantis.grosbeak.cable.template.JavaScriptTemplate用来渲染一段JavaScript脚本代码。响应content-type:application/x-javascriptorg.atlantis.grosbeak.cable.template.JsonTemplate用来渲染一段JSON字符串。响应content-type:text/htmlorg.atlantis.grosbeak.cable.template.TextTemplate用来渲染一段普通的文本字符串。响应content-type:text/html如果仅仅是跳转到一个页面,那么可以直接返回“redirect:”开头的字符串,“redirect:”后面紧跟要跳转到的页面的路径,如“redirect:login.jsp”。如果需要执行一句JavaScript,那么也可以直接返回“script:”开头的字符串,“script:”后面紧跟要执行的JavaScript代码,如“script:alert(注册成功)”。3.2.2 DAO功能结构设计在Grosbeak框架中实现DAO功能的具体包是:org.atlantis.grosbeak.pot。pot中文是“罐子”,意为:将数据存放到数据库中。它主要的功能就是持久化数据,和Hibernate一样,但与Hibernate不同的是Grosbeak框架中的DAO并不屏蔽SQL语句,而且鼓励所有对数据库的操作都通过SQL语句来完成的。因为执行原始的SQL语句,速度更快、性能更好。DAO主要是用于持久层,而持久层是在业务逻辑层和数据库层之间,主要功能是把相关业务数据存储到数据库中,或从数据库中查询相关业务数据21。如图3-2-2-1所示:图3-2-2-1 持久层位置图而把持久层从业务逻辑层分离出来的好处在于:(1)代码可重用性高,能够完成所有的数据库访问操作。(2)能够支持多种数据库平台。(3)具有相对的独立性,当持久层的实现发生变化时,不会影响上层。 虽然Grosbeak框架中的DAO完全使用SQL对数据库进行操作,但是它同样是一个OR/Mapping的实现。因为在保存、修改、查询数据时,都是对Java实体对象进行操作,并不是对ResultSet、PreparedStatement等JDBC对象进行操作。Hibernate是通过*.hbm.xml配置文件来映射实体对象和数据库表中的数据,但是Grosbeak框架中的DAO则是通过硬编码接口来实现两者的映射。即用户需要实现框架提供的接口来完成映射逻辑的实现。框架内部默认提供了多种常用的映射逻辑,可以通过反射机制直接为普通的Java实体类与数据库表实现映射。 Grosbeak框架中的DAO屏蔽了JDBC中的所有接口,用户不需要了解JDBC的任何知识就能够完成持久化的开发,从而降低的学习的曲线。它同样支持简单的事务,在持久化出现错误时,事务会自动回滚。不过为了灵活需要,它提供了各种回调方法,使用户也可以自己手动来控制Connection、ResultSet等JDBC接口。 它同时也支持数据库连接池,如果是很小型的网站开发也完全可以使用框架内部提供的一个完全基于DriverManager的连接池。但是框架内部提供的连接池,并不会缓存Connection连接,而只是起到一个连接到数据库的作用,每次Connection使用完毕后都会直接关闭而不是回收,所以如果数据量访问较大的情况下,推荐使用C3PO、DBCP这样的专业数据库连接池24。 Grosbeak中DAO应用的场景如图3-2-2-2所示:图3-2-2-2 Grosbeak框架的DAO应用场景图它的执行流程也非常简单:首先通过反射机制实例化用户的DAO类;然后读取DAO类中指定方法上的SQL注解,再来判断这个SQL是一个查询语句还是更新语句,如果是更新语句则自动开启事务;再获取传递给指定方法的参数,并解析参数,把解析后的参数填充到SQL语句的占位符中,并执行SQL语句。如果当前执行的是查询操作,那么根据实体对象和数据库表之间的映射关系把查询结果填充到用户的实体对象中。如果当前执行的是更新操作,那么就提交事务。执行流程的示例图如图3-2-2-3所示:图3-2-2-3 执行流程图3.2.3 IOC功能结构设计在Grosbeak框架中实现IOC功能的具体包是:org.atlantis.grosbeak.depot。depot中文为“仓库”,意为存放管理对象的容器。其主要作用就是管理类与类之间的关系。面向对象设计原则中“别找我们,我们会找你”的好莱坞原则表示所有的组件都是被动的,所有的组件初始化和调用都有容器负责。而IOC(控制反转)意味着在系统开发过程中,设计的类将交由容器处理,一个类在需要调用另一个类时,只要调用另一个类在容器中注册的ID就可以得到这个类的实例27。Grosbeak框架的IOC容器采用JSON作为配置文件,因为JSON比XML更加轻量级,而且很多程序开发人员都非常了解JSON的格式。下面就是一个简单的JSON的配置文件的片段:demo : type : org.atlantis.grosbeak.depot.test.Demo,singleton : false,args : SeeNoEvil ,fields : birthday : 1988-02-09,friend : refer : atlantis这个片段的意思是:在容器中声明了一个id为demo的类,这个类的类型是“org.talantis.grosbeak.depot.test.Demo”,并且不需要单态,然后通过构造方法实例化这个类时需要注入一个为“SeeNoEvil”的字符串,并且通过给birthday、friend两个字段赋值,而friend的值是另外一个id为“atlantis”的容器中的对象。 Grosbeak框架中的IOC会监听对象声明周期中的三个事件:创建、从容器中获取、销毁。在这三个时刻,用户可以做一些特殊的操作。比如当一个数据源对象被销毁时,可以关闭所有连接。具体的操作需要在JSON配置文件中完成,下面是一个监听器的配置片段:demo : type : org.atlantis.grosbeak.depot.test.Demo,singleton : false,events : fetch : org.atlantis.grosbeak.depot.test.DemoFetch这个片段中events的配置项说明:当从IOC容器中获取Demo对象时会执行DemoFetch这个类。 注入值是IOC容器所必备的功能,Grosbeak框架中的IOC目前支持向构造方法参数和字段两个位置注入值。注入值的类型除了Java常见类型外还包括如表3-2-3-1所示的类型:表3-2-3-1 Grosbeak框架IOC支持注入的值类型表简介说明内部类即没有id的匿名对象引用即容器中的其它对象。如:refer : atlantis获得的是容器中id为“atlantis”的对象环境变量即环境变量的值。如:env : JAVA_HOME获得的是环境变量中“JAVA_HOME”关键字的值文件即一个File对象。如:file : c:/a.txt获得的是一个File(“c:/a.txt”)文件对象。 Grosbeak框架的IOC还有一个特别的功能是筛选功能,筛选功能是需要实现org.atlantis.grosbeak.depot.Boult接口来定义筛选的逻辑。等IOC容器解析完配置文件后,就可以通过ids方法获取所有通过筛选的类的id。这个特性在MVC和DAO中大量的使用。3.2.4 Lang功能结构设计Lang的主要作用是封装了众多的常用方法,从而简化用户的操作。同时Lang也是框架中所有功能模块必须依赖的功能。3.3 主要代码Grosbeak框架中的接口很多,但是都对使用者屏蔽了,所以使用者只需要了解很少的接口就可以使用Grosbeak框架进行开发了。下面的代码是用户需要了解的一些最主要的接口。(1)Depot.java:这是IOC容器提供给使用者最重要的一个接口。使用者可以从这个接口中获取自己需要的对象、重置容器、销毁容器等。接口中每个方法都有较为详细的注释,来介绍这个方法的作用。public interface Depot /* * 从指定的环境中获取指定类型、ID的对象。 * param type 要获取的对象的类型。 * param id 对象在容器中的ID。 * param env 容器的环境。 * return 获取到的对象。 * throws DepotException */ T get(Class type, String id, DepotEnv env) throws DepotException;/* * 从容器中获取一个指定类型、ID的对象。 * param type 要获取的对象的类型。 * param id 对象在容器中的ID。 * return 获取到的对象。 * throws DepotException */ T get(Class type, String id) throws DepotException;/* * 从容器中获取一个指定ID的对象的类型。 * param id 指定的ID * return 在容器中指定ID的对象的类型。 * throws DepotException */Class getType(String id) throws DepotException;/* * 判断容器中是否存在指定ID的对象。 * param id 指定的ID。* return 容器中如果存在对应指定ID的对象则返回true,否则返回false。 * throws DepotException */boolean has(String id) throws DepotException;/* * 获取容器中所有对象的ID。 * return 容器中所有对象的ID数组。 */String ids();/* * 重置容器,把容器恢复到刚创建的状态。 */void reset();/* * 销毁容器,销毁后的容器是不能再使用的。 */void destroy(); (2)CableInitContext.java:这是MVC中最重要的初始化工具,它是一个ServletContextListener实现类,在容器启动时开始启动IOC容器读取配置文件,然后从IOC中找出所有用于初始的类,对整个系统进行初始化操作。public class CableInitContext implements ServletContextListener private final static Logger logger = LoggerFactory.getLogger(CableInitContext.class);public void contextInitialized(ServletContextEvent sce)Fmt(Cable framework is initializing .);ServletContext sc = sce.getServletContext();/ 获得用户配置的Boult筛选器器,并和Cable所必需的筛选器合并/ 在一起String boultNames = sc.getInitParameter(boults);ArrayList boults = new ArrayList();boults.add(new ActionBoult();boults.add(new InterceptorBoult();if (boultNames != null) String boultArray = Strings.spliteIgnoreBlank(boultNames, ,);for (String boultName : boultArray) try Mirror boult = Mirror.me(Class.forName(boultName);boults.add(Boult) boult.fruit(); catch (Exception e) throw Exceptions.makeThrow(CableException.class, Unable to instance %s., boultName);/ 开启秒表Stopwatch watch = Stopwatch.begin();/ 获取所有的Depot配置文件String configFiles = sc.getInitParameter(configs);/ 如果获取不到配置文件,则抛出一个异常if (Strings.isBlank(configFiles)throw Exceptions.makeThrow(CableException.class,Unable to find any Depot Json configuration files.);/ 将配置文件字符串切割开来String configs = Strings.spliteIgnoreBlank(configFiles);BoultDepot depot = new Depoter(new JsonLoader(configs), boults.toArray(new Boult0);/ 将Depot容器存入到ServletContext中sc.setAttribute(BoultDepot.class.getName(), depot);/ 从Depot容器中获取转换器的配置路径CastorConfig cc = null;try depot.get(CastorConfig.class, castorConfig); catch (DepotException e) Castors castors = Castors.me();if (cc != null & cc.getConfigs().length 0) castors.addPath(cc.getCon
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中水循环考试题及答案
- 高空知识培训考试题及答案
- 申论有关民生真题及答案
- 高考改错考试题目及答案
- 2025年高二物理下学期个性化学习方案测试
- 钢材考试题库及答案
- 移动互联技术题库及答案
- 护理老师笔试试题及答案
- 2025年爆破作业人员技能与安全知识考试题库(附含答案)
- 2025年保育员职业技能培训考试题库及答案
- 森林防火智能预警监测系统方案
- 1200吨黑水虻养殖项目可行性研究报告写作模板-备案审批
- 13《黄鹤楼》公开课课件
- 申办餐饮食品经营许可证:14项管理制度清单
- 为什么篮球可以弹起来
- 第2课 第一框 中国特色社会主义的开创和发展
- 鱼池净化系统施工方案
- 新概念第一册语法汇总
- 第八届全国小动物医师技能大赛考试复习题库(含答案)
- 2输变电工程施工质量验收统一表式(变电工程土建专业)
- 公司职级职务管理办法RL
评论
0/150
提交评论