梁 弼,王光琼,邓小清
(四川文理学院智能制造学院, 四川 达州 635000)
当前,国内外最成熟的分层架构体系应该是J2EE的多层Web应用架构,并以Struts2、Spring和Hibernate为主流技术成为多层架构的典型,即经典SSH的三层架构解决方案[1]。它将整个Web应用系统划分为表示层、业务逻辑层及数据持久层,并且每一层分别承担特定的任务。其中:表示层用来接收/响应用户请求,同时实现对数据的动态显示,该任务由Struts2完成;业务逻辑层完成应用系统具体的业务逻辑功能,该任务主要由Spring承担;数据持久层则完成O-R映射,并以面向对象的方式访问后台关系型数据库,它通过Hibernate实现。这样Web应用的各层任务便分别由Struts2、Spring及Hibernate(简称SSH) 3种不同技术实现,彼此相互协作一起完成整个Web应用的功能[2]。因为这种方案不但有利于任务的分工,而且有利于应用系统后期的开发、部署、维护和扩展,所以目前已广泛应用于各种企业级Web应用,如在线购物平台、网上订票系统等[3]。
然而,在经典SSH三层架构解决方案中,由于Struts2、Spring和Hibernate是3种不同类型的开源框架,分别来源于不同的组织机构,并完成三层Web应用中不同层次上的不同任务,当后期进行模块整合时便会出现不同技术所对应的jar包、XML文件及程序代码不兼容等情况,从而导致系统难以整合,进而延长系统开发周期,并且交付后的系统还存在扩展难、维护不方便以及性能差等不良现象[4]。为解决使用经典SSH方案来开发三层Web应用所产生的这些问题,本文提出了一种以Spring框架为核心的基于3S(Spring MVC+Spring IoC/DI+Spring JDBC)的三层架构轻量级解决方案(简称轻量级3S方案),并通过古建筑文物信息管理系统(即ABHIMS)来进行具体实验。实验结果表明该方案是可行且有效的。
3S技术即由Spring MVC、Spring IoC/DI 和 Spring JDBC组合而成,它们是Spring框架中Spring Web MVC、Spring Core和Spring ORM这3个模块的核心技术,也是本文轻量级3S方案的关键技术。
Spring MVC是一个细致完整的MVC框架。其中:Controller主要负责协调组件之间的控制;Model由应用系统状态BeanForm或业务逻辑的JavaBean来构建;View是由JSP、Velocity或者其他表现层技术实现[5]。Spring MVC采用了一种优雅的视图解析方式,它的Controller返回一个ModelAndView对象,该对象的属性就是视图名字和模型,模型提供了Bean的名字以及与其对象的对应关系。它还充分利用Spring非侵入式编程的优点,使开发者只须简单配置XML文件而无须实现任何Spring有关接口。
Spring IoC是Spring框架的核心技术,它实现了Spring重要的“解耦”思想,并通过DI使类与类之间不再由硬性编码方式发生关联,而是通过XML配置来实现这一过程,属于Spring Core模块技术[6]。Spring 通过IoC容器来自动创建应用系统中以后需要的所有Bean对象,并进行对象属性设置和连接配置,当对象被调用时容器便主动给出。这种自动赋值方式,把对象的生命周期管理、依赖关系等问题都由类本身转移到IoC容器,这样减轻了开发人员的编码负担,优化了Bean对象的管理方式。
Spring JDBC是一种ORM框架技术,完成对JDBC轻量封装。它由核心包Core、数据源包Datasource、对象包Object以及支持包Support组成,其中最重要的是核心包Core,该包中最关键的类是JdbcTemplate[7]。它通过提供相应的模板和辅助类来完成对数据库中数据的CRUD操作,有效解决了使用JDBC API对数据库的繁琐操作以及代码冗余的问题;它还替开发人员自动完成了资源的创建以及释放工作,从而简化了对JDBC API的使用:所以Spring JDBC是Spring DAO模块中的一种技术。
本文源于经典SSH三层架构解决方案的思想[8-9],使用轻量级的3S技术来取而代之,即:采用Spring MVC及JSP技术来实现表示层,完成对用户请求的转发控制,并使用Java反射机制调用业务逻辑层组件进行业务处理;在业务逻辑层,通过使用Spring IoC/DI来简化业务组件Bean的编写,并调用数据持久层接口来访问后台关系数据库,实现Web应用中具体的业务逻辑功能和事务处理;在数据持久层,让Spring JDBC负责与关系数据库通信,并编写DAO类来完成对关系数据的CRUD操作。其方案的总体设计如图1所示。这样,以Spring为核心的3S技术便完成了三层Web应用的任务。
图1 轻量级3S的三层架构解决方案图
从图1可见,与经典SSH的三层架构解决方案相比,该轻量级3S方案主要使用Spring相关技术(即3S)来实现,所采用的技术及开发思路更为单一;因此在后期进行整合时不论是Java代码整合还是XML文件整合都相对容易,而且避免了不同框架技术整合时jar、XML等文件不兼容的情况发生。具体优势有下面几点。
1)取消了Hibernate的映射文件*.hbm.xml,将O-R映射任务交由更为灵活的Spring JDBC来完成,而不需要专门编写XML映射文件来完成对象和关系的转换任务,从而减少了配置文件的数量,为后续整合带来了便利。
2)取消了Hibernate.cgf.xml和Struts.xml配置文件,由Spring的配置文件Spring.xml来统一配置相关信息,并通过自动扫描功能component-scan使该配置文件变得更为简单,这是本文3S方案最大的优点。它将SSH方案中Spring技术、Hibernate技术和Struts技术中的XML配置文件融合为一个配置文件(即Spring.xml),这不仅缩减了Web应用的配置文件数量而且大大缩减了XML代码量。
3)通过灵活使用Spring的注解功能,如@Transaction、@RequestMapping等,有效缩减程序中Java代码量以及Spring.xm中的配置量,提高了代码编写效率,使编译和调试更加方便和快捷,从而缩短了软件的开发周期并节约了软件开发成本。
4)通过使用Spring IoC/DI技术简化了Bean的编写、组装以及对大量Bean的管理,也减小了XML配置的复杂度,且易于学习和掌握,这很好地让Web程序开发人员从以前繁琐的Bean编写、配置和维护中解放出来,进而减轻了开发人员的负担和压力。
同时,基于该方案所构建的三层Web应用程序是一种弱耦合结构,层与层之间的联系很少,这有利地提高了完成各层功能的灵活性,有效地实现了“高内聚低耦合”的软件开发目标。
对本方案实现首先要搭建它所需的开发环境,包括导入相关jar包,配置Web.xml及Spring.xml;接着在表示层通过JSP实现交互界面,并通过Spring MVC分发来自客服端的用户请求,根据前端控制器DispatcherServlet接收到的请求委派相应的后端控制器Controller,Controller只负责向业务逻辑层传递参数和指定要调用的业务服务Bean,IoC容器会主动向Controller提供其需要的具体Bean。在业务逻辑层,根据Web应用具体的业务逻辑,装配相应的DAO以完成某个业务模块功能,同样该层仍由IoC容器主动提供所需要的DAO组件来完成业务功能,并提供事务管理、缓冲池等组件来提高Web应用的性能[10]。最后数据持久层的DAO依赖于Spring JDBC对数据库的强大交互能力来处理DAO组件请求的数据,并按顺序依次返回处理结果给客户端用户。这样轻量级3S方案便实现了对用户请求的处理[11],其处理的基本流程如图2所示。
图2 基于3S的三层架构请求处理流程图
古建筑文物是祖先为我们留下的珍贵文化瑰宝,我们应该使用现代信息技术来有效管理它们。本文将所提出的轻量级3S方案应用于ABHIMS实例[12]中。该实例由前台和后台2部分组成,前台实现古建筑文物展示,后台完成对古建筑文物相关数据的管理。依据该方案中所涉及到的技术需求,先搭建本系统的开发环境,以MyEclipse 9.0为开发平台,Tomcat 7.0为后台服务器,SQL Server 2008为数据库工具,并使用Spring MVC、Spring IoC/DI、Spring JDBC及JSP等技术按照其层次任务依次实现ABHIMS,同时导入相关的jar包,其具体实现过程如下。
表示层的任务主要是创建与古建筑文物相关的页面来实现它们的展示,并编写Controller来对用户Http请求的转发控制。本文ABHIMS的表现页面主要通过Html5和JSP技术来实现,具体有index.html、ancientBuildingDetail.html、register.jsp、login.jsp、user.jsp等;Controller功能则通过Spring MVC来实现,主要的控制文件有AncientBuildingController.java、UseController.java、AdminController.java及PictureController.java等[13],其中PictureController.java的伪代码格式如下:
……@Controller@RequestMapping("/picture")
public class PictureController {
@RequestMapping("/center")
public String center(){return "picture";}
@InitBinder
public void initBinder( WebDataBinder initbinder ){
binder.registerCustomEditor(……);} }……
其他控制文件格式类同。
业务逻辑层的主要任务是编写与古建筑文物操作相关的Bean,实现ABHIMS的业务功能。该系统的业务逻辑层主要通过Spring IoC/DI来简化业务Bean的编写以及对它们的管理。相关的业务Bean主要有AncientBuildingService.java、UseService.java、AdminService.java和PictureService.java等。此层中关键任务是配置Spring.xml,它是整个Web应用的基础和核心[14],通过它将上下各层有机地融合在一起,其配置模板形式如下:
p:dataSource-ref="dSource"/>…… 数据持久层的主要任务是把古建筑文物相关信息持久化到关系数据库中,实现对数据的CRUD操作,这主要通过编写DAO来实现。本文ABHIMS的数据持久层采用Spring JDBC来完成。相关的DAO类主要有AncientBuildingDAO.java、UseDAO.java、AdminDAO.java及PictureDAO.java等[15]。其中AncientBuildingDAO中获取所有古建筑文物信息关键伪代码结构如下: ……jdbcTemplate.query(sql, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { AncientBuilding ancientBuilding=new AncientBuilding(); ancientBuilding.setBuilding_content(rs.getString( "building_content"));…….}});…… 通过使用本文所提出的轻量级3S方案来实现ABHIMS,在开发周期、代码行数、配置文件种类及软件大小等方面与经典SSH的三层架构解决方案在相同的环境下开发本案例进行比较,实验所得到的具体数据如表1所示。 表1 2种解决方案应用比较 由表1可知,相对于经典SSH的三层架构解决方案来讲,使用轻量级3S方案来开发相同的ABHIMS所需的开发周期缩短了33.51%,整合时的出错率减少了14.27%,其优势得到了很好的证实。 同时,使用目前主流的LoadRunner测试工具[16-17]对它们各模块分别进行了性能测试,主要包括响应时间、吞吐量、CPU利用率及事务通过率等,其中查询操作的响应时间和吞吐量测试结果如表2所示。 表2 查询操作测试结果 由表2可以看出,在相同实验条件下,采用轻量级3S方案来实现的ABHIMS查询操作不论是响应速度还是吞吐量都比经典SSH方案开发得好,并且轻量级3S的平均吞吐量是经典SSH的1.46倍。对于不同的并发数,它们所得到的响应时间和吞吐量测试结果如图3—4所示。 图3 不同并发数的平均响应时间 图4 不同并发数的平均吞吐量 对其他操作模块进行性能测试也取得类似结果。由此可见,基于轻量级3S方案来实现的ABHIMS具有较好的性能。 构建有效的三层架构解决方案是Web应用研究中一个非常重要的内容,方案的优劣将直接影响Web应用系统后期的开发、运行及维护。本文不仅提出了一种基于3S的三层架构轻量级解决方案,还将其应用于古建筑文物信息管理系统进行具体实验。实验结果表明,该轻量级3S方案是正确可行的。它为软件开发人员提供了一种新的开发策略。该策略进一步解决了软件开发中周期长、整合不兼容等问题,为编写配置少、规模小、速度快、性能好以及用户体验强的Web应用提供了技术支持,因此值得进一步推广和使用;然而这种方案在一定程度上降低了代码的可读性,使得系统后期的可维护性减弱。它以牺牲系统可维护来换取系统性能为代价,因此在实际使用中应该把握一个度,这是后续研究中一个关键问题。 参 考 文 献 [1] MOHAMED Ghetas, CHAN Huah Yong, PUTRA Sumari. A survey of quality of service in multi-tier web applications [J]. KSII Transactions on Internet and Information Systems, 2016, 10(1):238-256. [2] 谌湘倩,狄文辉,孙冬.基于SSH框架与Ajax技术的Java Web应用开发[J].计算机工程与设计, 2009,30(10):2590-2591. [3] YANG Liangtao. Management system of teaching resource based on ssh framework [C]//Information Technology and Computer Science:Proceedings of 2012 National Conference on Information Technology and Computer Science. Lanzhou: Service Academy Conference Center(SACC-China),2012:803-806. [4] Introduction to the Spring Framework [EB/OL].[2017-09-21].http://spring.io/docs/reference. [5] 徐金虎,宋斌,丁锐.Spring MVC+Hibernate+jQuery模式开发框架应用研究[J]. 自动化技术与应用,2015,34(3):42-46. [6] MUKHERJEE Anshuman, TARI Zahir, BERTOK Peter. A Spring based framework for verification of service composition [C]//2011 IEEE International Conference on Services Computing. Washington, DC, USA:IEEE,2011:258-265. [7] Spring JDBC reference documentation. introduction to the Spring JDBC [EB/OL]. [ 2017-09-21].http://docs.spring.io/spring-data/jdbc/docs/. [8] LIANG Bi. Study on a novel and lightweight five-layer architecture and its application [C]//2016 2nd International Conference on Energy Equipment Science and Engineering (ICEESE 2016). Guangzhou: CRC Press, 2016:1085-1090. [9] ZHANG Dandan, WEI Zhiqiang, YANG Yongquan. Research on lightweight MVC framework based on Spring MVC and Mybatis [C]//2013 Sixth International Symposium on Computational Intelligence and Design. Hangzhou:IEEE,2013:350-353. [10] 李守振,张南平,常国锋. Web应用分层与开发框架设计研究[J].计算机工程, 2006,32(11):274-276. [11] 闫宏印,张卫争,刘超慧. 开源框架下Web应用分层的设计与实现[J].计算机工程与设计, 2008,29(23):6023-6028. [12] 郑佳佳,赵军. 滁州市不可移动文物管理信息系统设计和实现[J].地理空间信息, 2009,7(5):45-47. [13] Spring-MVC-Chat. A chat sample using Spring MVC 3, Servlet-based, async request processing [EB/OL]. [ 2017-09-21]https://github.com/rstoyanchev/spring-mvc-chat. [14] 周相兵,兰青青,江瑜清. 基于分层结构的Web服务与Ajax整合的中间件实现研究[J]. 计算机应用与软件, 2008,25(11):97-99. [15] PAN HaiLan, CHEN Jian, WU Cuihong. The network platform based on Struts2 + JPA + Spring Framework [C]//2010 International Conference on Educational and Information Technology (ICEIT 2010). Chongqing:IEEE, 2010:69-71. [16] 袁琳. 基于在线注册Web系统的性能测试及优化[D].西安:西安电子科技大学, 2015. [17] LIANG Bi. The study and application of the new control layer for Enterprise-Class web applications [J]. Journal of Computers (taiwan), 2017, 28(6):151-162.3.3 数据持久层的实现
4 实验结果分析
5 结束语