薛桂香,任女爾,閆世峰,林濤
(1.河北工業(yè)大學(xué)河北省大數(shù)據(jù)計算重點實驗室,天津 300401;2.河北工業(yè)大學(xué)計算機科學(xué)與軟件學(xué)院,天津 300401;3.天津城市一卡通有限公司技術(shù)開發(fā)部,天津 300457)
基于簡單工廠模式的SSH+ExtJs架構(gòu)泛型化研究
薛桂香1,任女爾2,閆世峰3,林濤2
(1.河北工業(yè)大學(xué)河北省大數(shù)據(jù)計算重點實驗室,天津 300401;2.河北工業(yè)大學(xué)計算機科學(xué)與軟件學(xué)院,天津 300401;3.天津城市一卡通有限公司技術(shù)開發(fā)部,天津 300457)
傳統(tǒng)的MVC軟件開發(fā)模式框架在實際的開發(fā)過程中由于存在大量相似的業(yè)務(wù)邏輯,程序繁雜而重復(fù),難以維護.本文基于簡單工廠設(shè)計模式,泛型化處理了傳統(tǒng)的SpringMVC+Spring+Hibernate框架,以ExtJs做視圖層處理并抽象通用使用模型,通過提供View-Service(視圖-服務(wù))的開發(fā)模式,降低了企業(yè)級信息管理軟件開發(fā)復(fù)雜度和開發(fā)工作量,為后期維護和團隊成員變更奠定了良好的基礎(chǔ).
Model-View-Cotraller;簡單工廠模式;SpringMVC+Spring+Hibernate+ExtJs 4;泛型化
傳統(tǒng)的企業(yè)級J2EE信息管理軟件大多以MVC模式開發(fā),即Model-View-Controller,通過Model模型層處理后臺業(yè)務(wù)邏輯,通過View視圖層處理前臺頁面展示,通過Control控制層處理視圖層和模型層之間的數(shù)據(jù)響應(yīng).同時,為了進一步將開發(fā)精力集中到業(yè)務(wù)處理過程中,逐步發(fā)展出了今天盛行的java web框架,如struts2、springMVC等封裝處理了Servlet模型作為控制層,Hibernate在面向?qū)ο缶幊毯完P(guān)系型數(shù)據(jù)庫之間奠定了橋梁,使得通過面向?qū)ο筇幚黻P(guān)系型數(shù)據(jù)庫成為可能,Spring則以其切面編程(AOP)和依賴注入(Ioc)的容器處理策略大大降低了系統(tǒng)中靈活集成的復(fù)雜度.此外,還有半自動化持久化框架Ibatis、與JSP/Servlet高度耦合的Struts1等.在jsp處理端,出現(xiàn)了大量的javascript框架,如Jquery、ExtJs等.
在處理過程中,java后臺也分層處理成Action、Service、DAO、Entity層,分別負責(zé)交互、業(yè)務(wù)處理、數(shù)據(jù)庫持久化操作、實體類層,再加上基于接口的靈活配置以便控制各個模塊耦合性和內(nèi)聚性.但實際的軟件開發(fā)過程中,項目開發(fā)人員水平參差不齊,有些開發(fā)人員即使有良好的思維設(shè)計出色的業(yè)務(wù)但卻缺少良好的編程習(xí)慣,軟件到后期變得越來越臃腫,業(yè)務(wù)變得越來越復(fù)雜,最終無法維護.在國外,很多大型的軟件架構(gòu)往往事先封裝好部分層次,僅提供業(yè)務(wù)處理和前臺的部分實現(xiàn)給軟件開發(fā)工程師,這樣使得大多數(shù)軟件開發(fā)工程師能夠開發(fā)出相似而又規(guī)范的代碼,不但能夠使工程師完全集中精力于業(yè)務(wù)處理,還能夠方便項目后期維護和團隊成員更替.本論文在結(jié)合多種軟件框架基礎(chǔ)之上,遵循簡單工廠模式的軟件開發(fā)模式,泛型化優(yōu)化處理了SpringMVC+Spring+Hibernate框架;在此基礎(chǔ)上,抽象出了集中J2EE中常用的業(yè)務(wù)模型,在保證軟件運行效率的基礎(chǔ)上,簡化了J2EE開發(fā)的復(fù)雜性.
1.1 J2EE框架分析
MVC設(shè)計模式強制性的使web應(yīng)用頁面處理、業(yè)務(wù)邏輯計算處理和交互過程分開,將URL映射到JAVA后臺中,使得J2EE軟件工程師擁有良好的軟件開發(fā)體驗.當(dāng)前市場份額較大的Struts2和SpringMVC都很好的驗證了MVC設(shè)計模式的優(yōu)勢.其中,Spring MVC對Servlet泛化參數(shù)意義、泛化返回值意義,引入了Annotation;而Struts2引入ThreadLocal模式改造為Pojo模式.Struts2雖然早于Spring MVC,但Spring MVC跟Spring設(shè)計原則一脈相承:“Open for extension,closed for modification”,而且其清晰的設(shè)計思路和處理過程更加適合與Spring集成,因此本文采用Spring MVC來構(gòu)建MVC模式.
Spring是一個切面編程AOP和依賴注入Ioc的容器框架.Sping的Ioc容器,降低了組件之間的耦合性,可以讓我們更加專注于應(yīng)用邏輯,并且降低了業(yè)務(wù)對象替換的復(fù)雜性;其對事務(wù)管理、WS提供了很好的支持;Spring對其他框架都提供了很好的支持.基于以上優(yōu)勢,Spring在對J2EE項目中的集成起到中流砥柱的作用.本框架利用輕量級Spring,可以方便的整合其他框架.
Hibernate對JDBC進行了輕量級封裝,開發(fā)人員可以輕松地利用面向?qū)ο蟮木幊趟季S操縱關(guān)系型數(shù)據(jù)庫[1].而且,其獨到的自動化處理方式和支持方言等特性是其他持久化框架無法比擬的.本框架的設(shè)計是在分析了Java web多種框架的基礎(chǔ)上,選擇了Spring-MVC、Spring、Hibernate這三種框架作為框架基礎(chǔ);在前端的頁面展示中選擇了易于上手而功能強大的EXTJS組件.以下簡稱SSHE框架.圖1為傳統(tǒng)的SSHE對MVC的支持模式.
圖1 傳統(tǒng)SSHE的MVC模式Fig.1Traditional SSHE MVC Model
圖2 傳統(tǒng)SSHE調(diào)用過程Fig.2Traditional SSHE calls procedure
在傳統(tǒng)的SSHE框架中,Jsp、Extjs負責(zé)視圖層網(wǎng)頁展示,Spring通過注入的方式輔助Spring MVC作為控制層和輔助Hibernate作為模型層的處理[2].具體調(diào)用過程及調(diào)用關(guān)系如圖2所示.
如圖2所示,以登錄舉例,當(dāng)視圖層發(fā)送請求給服務(wù)器時,Spring在Controller層控制返回的頁面,如果需要處理業(yè)務(wù)邏輯,則調(diào)用Service層的方法,進一步調(diào)用Dao層的方法進行數(shù)據(jù)持久化過程.其中,可以在Service層通過切面編程的方式添加事務(wù)處理等過程[3].
1.2 簡單工廠模式
簡單工廠(Simple Factory)模式的用意在于給客戶端一個接口,可以通過接口創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象.如圖3所示,定義產(chǎn)品的接口,通過實現(xiàn)具體的產(chǎn)品可以創(chuàng)建產(chǎn)品工廠來生產(chǎn).簡單工廠模式可以以盡量少的修改量給系統(tǒng)帶來更大的可擴展型.通過簡單工廠模式,可以設(shè)計Action全自動化生產(chǎn),無需再進行繁瑣的定義和處理.
1.3 泛型化設(shè)計
泛型是Java SE 1.5中基于安全、簡單設(shè)計提出的新特性,泛型的本質(zhì)是將模糊參數(shù)的類型,也就是說把要操作的數(shù)據(jù)類型也指定為一個參數(shù),這種類型參數(shù)可以在類、接口和方法的創(chuàng)建中定義,對應(yīng)稱之為泛型類、泛型接口、泛型方法[4].泛型有類型安全、強制消除類型轉(zhuǎn)換并帶來較大的代碼優(yōu)化等優(yōu)點.支持泛型幾乎不需要類文件更改,所有的工作都在編譯時完成,編譯器生成的代碼類似于沒有使用泛型一樣,但是更能確保類型安全.在實際的eclipse開發(fā)環(huán)境中可以看到,當(dāng)調(diào)用帶有泛型的類時,一旦定義,后面的代碼編寫過程即可見到其真正的類型.因此,也無需擔(dān)心在運行時是否會影響運行效率的問題,但在代碼的編寫中卻極為方便、簡單、安全.
1.4 系統(tǒng)架構(gòu)概要
傳統(tǒng)的Action無論是通過注解定義還是通過xml配置文件定義,其定義過程都較為繁雜,而且極為相似、存在濫用的情況,很多開發(fā)者將大量的業(yè)務(wù)邏輯在Action層進行處理[5].本文充分利用開源框架SSHE,固定封裝了典型的Action定義,并在此基礎(chǔ)上基于簡單工廠模式、將傳統(tǒng)的Service層抽象成全自動化生產(chǎn)過程,自動生產(chǎn)Service組件.Action交互和Service生產(chǎn)組件都以對開發(fā)者透明的方式進行.開發(fā)者僅需在頁面直接定義Spring配置的bean的id進行請求,并自動將request、session中的參數(shù)映射到Service層方法的參數(shù)中.
圖3 簡單工廠模式原理圖Fig.3Simple factory pattern diagram
系統(tǒng)架構(gòu)基于簡單、有效、在不影響原有框架性能的基礎(chǔ)上提升軟件開發(fā)質(zhì)量的設(shè)計原則,分別在DAO層、Service層、Action層進行不同程度的封裝處理,并針對ExtJs進行了通用性設(shè)計.
2.1 Dao層設(shè)計
在Dao層,針對每個實體表都有CRUD操作,但是每個實體的CRUD都會編寫代碼,而此時引入通用Dao模式可以有效的消除重復(fù)代碼,減輕開發(fā)人員的負擔(dān).如下所示,本系統(tǒng)封裝的Dao層處理如下:
在GenericDao接口中,通過方法泛型的形式封裝了CRUD的基本方法[6],并且提供了HQL語言、SQL語言自定義使用方法,在基本的CRUD和HQL無法滿足系統(tǒng)開發(fā)的處理情況下,可以直接調(diào)用原生SQL進行處理,增強了架構(gòu)的通用性.這些方法均可以處理所有在Hibernate進行映射的實體類,完全滿足映射處理的方式.而在使用過程中,由于架構(gòu)已經(jīng)實現(xiàn)了各個抽象方法,無需再進行持久化具體處理,也無需為參數(shù)顯式聲明集合,開發(fā)者直接調(diào)用Dao層對象的方法即可.
2.2 Service設(shè)計
為了Service層對通用業(yè)務(wù)邏輯的封裝,架構(gòu)中定義了publicinterfaceGenericService<P,R>接口,并在接口中定義了public abstract R execute(P param)方法,該方法為所有業(yè)務(wù)邏輯處理的父接口,該接口的設(shè)計基于泛型,定義了泛型P和泛型R,分別代表了業(yè)務(wù)處理的請求參數(shù)和返回參數(shù).比如,請求參數(shù)為Map類型、返回參數(shù)為List類型的業(yè)務(wù)處理定義如下接口:public interface ListService<T>extends GenericService<Map<String,String>,List<T>>.開發(fā)者可以方便的將業(yè)務(wù)邏輯放在接口的類實現(xiàn)中.
2.3 View-Service企業(yè)級架構(gòu)設(shè)計
Action層很多時候只是做一次業(yè)務(wù)轉(zhuǎn)接操作,并不需要實際的業(yè)務(wù)處理,而且操作很類似,并且在很多系統(tǒng)中都存在Action層濫用問題;此外,由于Action處理中各種畫面跳轉(zhuǎn)邏輯,以及session,request獲取問題,導(dǎo)致Action很難進行單元測試.良好的軟件開發(fā)通常是把業(yè)務(wù)邏輯抽取出來放在Service層中,以方便進行單元測試,而讓Action僅僅負責(zé)業(yè)務(wù)邏輯跳轉(zhuǎn).
圖4 本架構(gòu)的簡單工廠模式設(shè)計原理Fig.4The design principle of simple factory pattern in this architecture
圖5 通用模塊設(shè)計返回參數(shù)類Fig.5Universal module design parametersand return type class
本架構(gòu)基于簡單工廠模式進行設(shè)計,抽象出了通用Service層接口和Action處理.如圖4所示,Service層接口GenericService作為簡單工廠模式中的產(chǎn)品,具體Service生產(chǎn)則由GenericAction產(chǎn)品生產(chǎn)器進行創(chuàng)建和調(diào)用[7].換言之,當(dāng)瀏覽器中發(fā)送請求url時,對外透明的GenericAction自動創(chuàng)建了響應(yīng)的Service處理.開發(fā)者在開發(fā)時,僅需在url中聲明要請求的Service方法即可實現(xiàn)對Service的調(diào)用.綜上所述,開發(fā)者可以遵循View-Service開發(fā)模式進行軟件項目開發(fā).
2.4 EXT通用模塊抽象與處理
為了降低軟件開發(fā)工作量,本架構(gòu)設(shè)計封裝了ExtJs交互通用Action.在Ext應(yīng)用中經(jīng)常使用到grid,這種數(shù)據(jù)結(jié)構(gòu)通常會需要一個list集合,還有一個記錄總數(shù);另外一種常用ext返回類型為一個boolean類型的處理標志和一個錯誤描述messgae信息.針對這兩類返回類型,通過泛型抽象實體類如圖5所示.
以上兩類Ext交互過程在Ext獲取數(shù)據(jù)時均以Ajax請求的方式進行,針對以上兩類Ext交互實體,封裝Action處理如下:
GridList類專門處理ExtJs中g(shù)ridpanal組件,比如當(dāng)需要返回GridList交互實體時,首先在View頁面端請求url為“/getGridList/{serviceName}”,“{serviceName}”為Service處理類在Spring環(huán)境中配置的id.開發(fā)者僅需在Spring配置其id,并將該Service實現(xiàn)接口GenericService,在該實現(xiàn)中可以任意擴展業(yè)務(wù)邏輯.
ExecResult設(shè)計用來處理表單Form請求,比如添加一個用戶,需要返回添加是否成功以及失敗的原因信息,首先在View頁面端請求“/getExecResult/{serviceName}”,同樣需要開發(fā)者在Spring中定義和實現(xiàn)響應(yīng)的Service.
傳統(tǒng)的SSHE在開發(fā)過程中調(diào)用復(fù)雜,很多開發(fā)人員并不清楚Service層和Dao層業(yè)務(wù)邏輯是如何區(qū)分的,因此各個開發(fā)人員對框架的把控能力不同直接增加了后期軟件維護的難度.圖2所示情況,對應(yīng)本架構(gòu)調(diào)用關(guān)系如圖6所示.
圖6 本架構(gòu)設(shè)計的通用SSHE調(diào)用關(guān)系圖Fig.6The general SSHE call graph of our architecture design
基于本架構(gòu),開發(fā)者首先需要在View層用Jsp和Ext定義響應(yīng)的頁面展示和對應(yīng)的url請求,url中的ServiceName直接映射到Service層中的具體實現(xiàn)類.具體實現(xiàn)類中通過調(diào)用通用Dao類中的方法進行持久化數(shù)據(jù)操作.對比傳統(tǒng)的SSHE開發(fā)過程,減少了Action層處理和冗余的Dao操作代碼.不僅規(guī)范了軟件開發(fā)過程,降低軟件開發(fā)工作量,而且使得軟件開發(fā)者能夠集中精力處理頁面展示和業(yè)務(wù)邏輯處理.
依據(jù)簡單工廠模式,對SSHE模型進行泛型化處理,設(shè)計實現(xiàn)了View-Service企業(yè)級架構(gòu)模型,在保證軟件原有性能的基礎(chǔ)上,該模型提供了自動化處理MVC中控制層,半自動化處理數(shù)據(jù)持久化過程和Service服務(wù)層的匹配,降低了J2EE軟件開發(fā)工作量和復(fù)雜度,為良好的軟件項目開發(fā)奠定了基礎(chǔ),在很大程度上方便了新成員入手和維護人員后期維護,提高了軟件開發(fā)效率和軟件質(zhì)量.
[1]秦育華.面向?qū)ο蟮臄?shù)據(jù)模型設(shè)計方法的研究與實現(xiàn)[J].電腦編程技巧與維護,2010(20):6-7.
[2]田娟,徐釗.基于J2EE的MVC設(shè)計模式的分析與思考[J].計算機與現(xiàn)代化,2010(10):54-58.
[3]陳雪娟.基于MVC模式的SSH開發(fā)技術(shù)[J].電腦學(xué)習(xí),2011(2):137-139.
[4]林帥,林雄.Java泛型研究[J].電腦開發(fā)與應(yīng)用,2012,25(3):63-65.
[5]劉萍.基于簡單工廠模式的三層架構(gòu)系統(tǒng)設(shè)計及應(yīng)用[J].中國科技信息,2013(14):107-107.
[6]蔣叢萃.JavaWeb程序運用中泛型DAO的作用[J].軟件,2012,33(5):91-92.
[7]夏齡.Spring中Bean工廠模式的改進[J].計算機應(yīng)用與軟件,2012(11):044.
[責(zé)任編輯 田豐夏紅梅]
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
河北省高等學(xué)??茖W(xué)技術(shù)研究項目(QN20131118);天津市應(yīng)用基礎(chǔ)與前沿技術(shù)研究計劃(14JCTPJC00517)
薛桂香(1979-),女(漢族),講師.通訊作者:林濤(1970-),男(漢族),教授,lintao@hebut.edu.cn.