APP下载

基于简单工厂模式的SSH+ExtJs架构泛型化研究

2015-07-07薛桂香任女尔闫世峰林涛

河北工业大学学报 2015年3期
关键词:调用开发者架构

薛桂香,任女尔,闫世峰,林涛

(1.河北工业大学河北省大数据计算重点实验室,天津 300401;2.河北工业大学计算机科学与软件学院,天津 300401;3.天津城市一卡通有限公司技术开发部,天津 300457)

基于简单工厂模式的SSH+ExtJs架构泛型化研究

薛桂香1,任女尔2,闫世峰3,林涛2

(1.河北工业大学河北省大数据计算重点实验室,天津 300401;2.河北工业大学计算机科学与软件学院,天津 300401;3.天津城市一卡通有限公司技术开发部,天津 300457)

传统的MVC软件开发模式框架在实际的开发过程中由于存在大量相似的业务逻辑,程序繁杂而重复,难以维护.本文基于简单工厂设计模式,泛型化处理了传统的SpringMVC+Spring+Hibernate框架,以ExtJs做视图层处理并抽象通用使用模型,通过提供View-Service(视图-服务)的开发模式,降低了企业级信息管理软件开发复杂度和开发工作量,为后期维护和团队成员变更奠定了良好的基础.

Model-View-Cotraller;简单工厂模式;SpringMVC+Spring+Hibernate+ExtJs 4;泛型化

0 概述

传统的企业级J2EE信息管理软件大多以MVC模式开发,即Model-View-Controller,通过Model模型层处理后台业务逻辑,通过View视图层处理前台页面展示,通过Control控制层处理视图层和模型层之间的数据响应.同时,为了进一步将开发精力集中到业务处理过程中,逐步发展出了今天盛行的java web框架,如struts2、springMVC等封装处理了Servlet模型作为控制层,Hibernate在面向对象编程和关系型数据库之间奠定了桥梁,使得通过面向对象处理关系型数据库成为可能,Spring则以其切面编程(AOP)和依赖注入(Ioc)的容器处理策略大大降低了系统中灵活集成的复杂度.此外,还有半自动化持久化框架Ibatis、与JSP/Servlet高度耦合的Struts1等.在jsp处理端,出现了大量的javascript框架,如Jquery、ExtJs等.

在处理过程中,java后台也分层处理成Action、Service、DAO、Entity层,分别负责交互、业务处理、数据库持久化操作、实体类层,再加上基于接口的灵活配置以便控制各个模块耦合性和内聚性.但实际的软件开发过程中,项目开发人员水平参差不齐,有些开发人员即使有良好的思维设计出色的业务但却缺少良好的编程习惯,软件到后期变得越来越臃肿,业务变得越来越复杂,最终无法维护.在国外,很多大型的软件架构往往事先封装好部分层次,仅提供业务处理和前台的部分实现给软件开发工程师,这样使得大多数软件开发工程师能够开发出相似而又规范的代码,不但能够使工程师完全集中精力于业务处理,还能够方便项目后期维护和团队成员更替.本论文在结合多种软件框架基础之上,遵循简单工厂模式的软件开发模式,泛型化优化处理了SpringMVC+Spring+Hibernate框架;在此基础上,抽象出了集中J2EE中常用的业务模型,在保证软件运行效率的基础上,简化了J2EE开发的复杂性.

1 软件架构设计技术及原理

1.1 J2EE框架分析

MVC设计模式强制性的使web应用页面处理、业务逻辑计算处理和交互过程分开,将URL映射到JAVA后台中,使得J2EE软件工程师拥有良好的软件开发体验.当前市场份额较大的Struts2和SpringMVC都很好的验证了MVC设计模式的优势.其中,Spring MVC对Servlet泛化参数意义、泛化返回值意义,引入了Annotation;而Struts2引入ThreadLocal模式改造为Pojo模式.Struts2虽然早于Spring MVC,但Spring MVC跟Spring设计原则一脉相承:“Open for extension,closed for modification”,而且其清晰的设计思路和处理过程更加适合与Spring集成,因此本文采用Spring MVC来构建MVC模式.

Spring是一个切面编程AOP和依赖注入Ioc的容器框架.Sping的Ioc容器,降低了组件之间的耦合性,可以让我们更加专注于应用逻辑,并且降低了业务对象替换的复杂性;其对事务管理、WS提供了很好的支持;Spring对其他框架都提供了很好的支持.基于以上优势,Spring在对J2EE项目中的集成起到中流砥柱的作用.本框架利用轻量级Spring,可以方便的整合其他框架.

Hibernate对JDBC进行了轻量级封装,开发人员可以轻松地利用面向对象的编程思维操纵关系型数据库[1].而且,其独到的自动化处理方式和支持方言等特性是其他持久化框架无法比拟的.本框架的设计是在分析了Java web多种框架的基础上,选择了Spring-MVC、Spring、Hibernate这三种框架作为框架基础;在前端的页面展示中选择了易于上手而功能强大的EXTJS组件.以下简称SSHE框架.图1为传统的SSHE对MVC的支持模式.

图1 传统SSHE的MVC模式Fig.1Traditional SSHE MVC Model

图2 传统SSHE调用过程Fig.2Traditional SSHE calls procedure

在传统的SSHE框架中,Jsp、Extjs负责视图层网页展示,Spring通过注入的方式辅助Spring MVC作为控制层和辅助Hibernate作为模型层的处理[2].具体调用过程及调用关系如图2所示.

如图2所示,以登录举例,当视图层发送请求给服务器时,Spring在Controller层控制返回的页面,如果需要处理业务逻辑,则调用Service层的方法,进一步调用Dao层的方法进行数据持久化过程.其中,可以在Service层通过切面编程的方式添加事务处理等过程[3].

1.2 简单工厂模式

简单工厂(Simple Factory)模式的用意在于给客户端一个接口,可以通过接口创建多个产品族中的产品对象.如图3所示,定义产品的接口,通过实现具体的产品可以创建产品工厂来生产.简单工厂模式可以以尽量少的修改量给系统带来更大的可扩展型.通过简单工厂模式,可以设计Action全自动化生产,无需再进行繁琐的定义和处理.

1.3 泛型化设计

泛型是Java SE 1.5中基于安全、简单设计提出的新特性,泛型的本质是将模糊参数的类型,也就是说把要操作的数据类型也指定为一个参数,这种类型参数可以在类、接口和方法的创建中定义,对应称之为泛型类、泛型接口、泛型方法[4].泛型有类型安全、强制消除类型转换并带来较大的代码优化等优点.支持泛型几乎不需要类文件更改,所有的工作都在编译时完成,编译器生成的代码类似于没有使用泛型一样,但是更能确保类型安全.在实际的eclipse开发环境中可以看到,当调用带有泛型的类时,一旦定义,后面的代码编写过程即可见到其真正的类型.因此,也无需担心在运行时是否会影响运行效率的问题,但在代码的编写中却极为方便、简单、安全.

1.4 系统架构概要

传统的Action无论是通过注解定义还是通过xml配置文件定义,其定义过程都较为繁杂,而且极为相似、存在滥用的情况,很多开发者将大量的业务逻辑在Action层进行处理[5].本文充分利用开源框架SSHE,固定封装了典型的Action定义,并在此基础上基于简单工厂模式、将传统的Service层抽象成全自动化生产过程,自动生产Service组件.Action交互和Service生产组件都以对开发者透明的方式进行.开发者仅需在页面直接定义Spring配置的bean的id进行请求,并自动将request、session中的参数映射到Service层方法的参数中.

图3 简单工厂模式原理图Fig.3Simple factory pattern diagram

2 系统架构设计与实现

系统架构基于简单、有效、在不影响原有框架性能的基础上提升软件开发质量的设计原则,分别在DAO层、Service层、Action层进行不同程度的封装处理,并针对ExtJs进行了通用性设计.

2.1 Dao层设计

在Dao层,针对每个实体表都有CRUD操作,但是每个实体的CRUD都会编写代码,而此时引入通用Dao模式可以有效的消除重复代码,减轻开发人员的负担.如下所示,本系统封装的Dao层处理如下:

在GenericDao接口中,通过方法泛型的形式封装了CRUD的基本方法[6],并且提供了HQL语言、SQL语言自定义使用方法,在基本的CRUD和HQL无法满足系统开发的处理情况下,可以直接调用原生SQL进行处理,增强了架构的通用性.这些方法均可以处理所有在Hibernate进行映射的实体类,完全满足映射处理的方式.而在使用过程中,由于架构已经实现了各个抽象方法,无需再进行持久化具体处理,也无需为参数显式声明集合,开发者直接调用Dao层对象的方法即可.

2.2 Service设计

为了Service层对通用业务逻辑的封装,架构中定义了publicinterfaceGenericService<P,R>接口,并在接口中定义了public abstract R execute(P param)方法,该方法为所有业务逻辑处理的父接口,该接口的设计基于泛型,定义了泛型P和泛型R,分别代表了业务处理的请求参数和返回参数.比如,请求参数为Map类型、返回参数为List类型的业务处理定义如下接口:public interface ListService<T>extends GenericService<Map<String,String>,List<T>>.开发者可以方便的将业务逻辑放在接口的类实现中.

2.3 View-Service企业级架构设计

Action层很多时候只是做一次业务转接操作,并不需要实际的业务处理,而且操作很类似,并且在很多系统中都存在Action层滥用问题;此外,由于Action处理中各种画面跳转逻辑,以及session,request获取问题,导致Action很难进行单元测试.良好的软件开发通常是把业务逻辑抽取出来放在Service层中,以方便进行单元测试,而让Action仅仅负责业务逻辑跳转.

图4 本架构的简单工厂模式设计原理Fig.4The design principle of simple factory pattern in this architecture

图5 通用模块设计返回参数类Fig.5Universal module design parametersand return type class

本架构基于简单工厂模式进行设计,抽象出了通用Service层接口和Action处理.如图4所示,Service层接口GenericService作为简单工厂模式中的产品,具体Service生产则由GenericAction产品生产器进行创建和调用[7].换言之,当浏览器中发送请求url时,对外透明的GenericAction自动创建了响应的Service处理.开发者在开发时,仅需在url中声明要请求的Service方法即可实现对Service的调用.综上所述,开发者可以遵循View-Service开发模式进行软件项目开发.

2.4 EXT通用模块抽象与处理

为了降低软件开发工作量,本架构设计封装了ExtJs交互通用Action.在Ext应用中经常使用到grid,这种数据结构通常会需要一个list集合,还有一个记录总数;另外一种常用ext返回类型为一个boolean类型的处理标志和一个错误描述messgae信息.针对这两类返回类型,通过泛型抽象实体类如图5所示.

以上两类Ext交互过程在Ext获取数据时均以Ajax请求的方式进行,针对以上两类Ext交互实体,封装Action处理如下:

GridList类专门处理ExtJs中gridpanal组件,比如当需要返回GridList交互实体时,首先在View页面端请求url为“/getGridList/{serviceName}”,“{serviceName}”为Service处理类在Spring环境中配置的id.开发者仅需在Spring配置其id,并将该Service实现接口GenericService,在该实现中可以任意扩展业务逻辑.

ExecResult设计用来处理表单Form请求,比如添加一个用户,需要返回添加是否成功以及失败的原因信息,首先在View页面端请求“/getExecResult/{serviceName}”,同样需要开发者在Spring中定义和实现响应的Service.

3 软件架构的使用原理

传统的SSHE在开发过程中调用复杂,很多开发人员并不清楚Service层和Dao层业务逻辑是如何区分的,因此各个开发人员对框架的把控能力不同直接增加了后期软件维护的难度.图2所示情况,对应本架构调用关系如图6所示.

图6 本架构设计的通用SSHE调用关系图Fig.6The general SSHE call graph of our architecture design

基于本架构,开发者首先需要在View层用Jsp和Ext定义响应的页面展示和对应的url请求,url中的ServiceName直接映射到Service层中的具体实现类.具体实现类中通过调用通用Dao类中的方法进行持久化数据操作.对比传统的SSHE开发过程,减少了Action层处理和冗余的Dao操作代码.不仅规范了软件开发过程,降低软件开发工作量,而且使得软件开发者能够集中精力处理页面展示和业务逻辑处理.

4 总结

依据简单工厂模式,对SSHE模型进行泛型化处理,设计实现了View-Service企业级架构模型,在保证软件原有性能的基础上,该模型提供了自动化处理MVC中控制层,半自动化处理数据持久化过程和Service服务层的匹配,降低了J2EE软件开发工作量和复杂度,为良好的软件项目开发奠定了基础,在很大程度上方便了新成员入手和维护人员后期维护,提高了软件开发效率和软件质量.

[1]秦育华.面向对象的数据模型设计方法的研究与实现[J].电脑编程技巧与维护,2010(20):6-7.

[2]田娟,徐钊.基于J2EE的MVC设计模式的分析与思考[J].计算机与现代化,2010(10):54-58.

[3]陈雪娟.基于MVC模式的SSH开发技术[J].电脑学习,2011(2):137-139.

[4]林帅,林雄.Java泛型研究[J].电脑开发与应用,2012,25(3):63-65.

[5]刘萍.基于简单工厂模式的三层架构系统设计及应用[J].中国科技信息,2013(14):107-107.

[6]蒋丛萃.JavaWeb程序运用中泛型DAO的作用[J].软件,2012,33(5):91-92.

[7]夏龄.Spring中Bean工厂模式的改进[J].计算机应用与软件,2012(11):044.

[责任编辑 田丰夏红梅]

The generic design and implementation of the frame SSH+ExtJs base on simple factory pattern

XUE Guixiang1,REN Nüer2,YAN Shifeng3,LIN Tao2

(1.Big Data Computing Key Laboratory of Hebei Province,Hebei University of Technology,Tianjin 300401,China;2.School of ComputerScienceandEngineering,Hebei Universityof Technology,Tianjin300401,China;3.DepartmentofTechnologyDevelopment, Tianjin City Card Co Ltd,Tianjin 300457,China)

The traditionalMVCsofeware development framework oftenprovidesgood programminglevel,buttheproject software become bloated and difficult to maintain in the actual development process because of the gap between software developers and the changes of team members.It makes that there is a large number of business similar in the development process.In this paper,the traditional SpringMVC+Spring+Hibernate framework is generic precessed based on simple factory pattern.The frame using ExtJs as the view layer processing frame and using the abstract universal model by providing the View-Service development mode reduces the complexity and development work of the enterprise information management software development.It has laid a good foundation for the later maintenance and the changes of team members.

model-view-cotraller;simple factory pattern;springMVC+Spring+Hibernate+ExtJs4;generic

TP311.52

A

1007-2373(2015)03-0065-05

10.14081/j.cnki.hgdxb.2015.03.013

2015-03-10

河北省高等学校科学技术研究项目(QN20131118);天津市应用基础与前沿技术研究计划(14JCTPJC00517)

薛桂香(1979-),女(汉族),讲师.通讯作者:林涛(1970-),男(汉族),教授,lintao@hebut.edu.cn.

猜你喜欢

调用开发者架构
基于FPGA的RNN硬件加速架构
功能架构在电子电气架构开发中的应用和实践
核电项目物项调用管理的应用研究
基于云服务的图书馆IT架构
WebGIS架构下的地理信息系统构建研究
“85后”高学历男性成为APP开发新生主力军
基于系统调用的恶意软件检测技术研究
16%游戏开发者看好VR
利用RFC技术实现SAP系统接口通信
C++语言中函数参数传递方式剖析