林鈺杰,吳麗賢
(廣東電網(wǎng)有限責(zé)任公司 佛山供電局,廣東 佛山528000)
基于整合框架的W eb應(yīng)用系統(tǒng)開發(fā)平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)
林鈺杰,吳麗賢
(廣東電網(wǎng)有限責(zé)任公司 佛山供電局,廣東 佛山528000)
面對(duì)日益復(fù)雜的Web應(yīng)用系統(tǒng)和變更頻繁的用戶需求,企業(yè)需要從紛繁復(fù)雜的開發(fā)框架中選出一套可行的解決方案以保持高效保質(zhì)的開發(fā)工作,為此,本文采用J2EE分層架構(gòu)思想構(gòu)建了一個(gè)面向Web應(yīng)用系統(tǒng)快速開發(fā)的開發(fā)平臺(tái),其中,平臺(tái)表現(xiàn)層采用Ember.js對(duì)JSP局部頁面進(jìn)行異步刷新,控制層由Spring MVC實(shí)現(xiàn),業(yè)務(wù)層以Spring Framework為基礎(chǔ)集成Activiti流程引擎和Velocity模板引擎,持久層由JPA負(fù)責(zé)完成與數(shù)據(jù)庫(kù)的交互。實(shí)踐證明,采用該開發(fā)平臺(tái)構(gòu)建的Web應(yīng)用系統(tǒng)均具有層次間耦合度低、模塊復(fù)用性高等特點(diǎn),大大提高了開發(fā)的效率,有效降低了開發(fā)和維護(hù)的成本。
Web應(yīng)用系統(tǒng);開發(fā)平臺(tái);MVC;Spring
隨著J2EE架構(gòu)的廣泛使用和現(xiàn)代社會(huì)的不斷發(fā)展,企業(yè)Web應(yīng)用系統(tǒng)也越來越復(fù)雜。對(duì)于Web應(yīng)用系統(tǒng)的開發(fā),一方面,J2EE架構(gòu)領(lǐng)域涌現(xiàn)了大量的優(yōu)秀開源框架,面對(duì)這些數(shù)量眾多的開發(fā)框架,企業(yè)如何進(jìn)行合理選擇便成了一個(gè)比較棘手的問題;另一方面,無論是企業(yè)作為乙方為甲方開發(fā)系統(tǒng),還是企業(yè)為滿足內(nèi)部業(yè)務(wù)需求進(jìn)行自主開發(fā),均需要面對(duì)在指定期限內(nèi)高效保質(zhì)完成任務(wù)并交付產(chǎn)品的壓力。為此,企業(yè)需要一個(gè)統(tǒng)一框架的開發(fā)平臺(tái)以達(dá)到快速開發(fā)的目標(biāo)。
文中根據(jù)J2EE分層架構(gòu)體系[1]提出了一套面向Web應(yīng)用系統(tǒng)快速開發(fā)的整合框架解決方案,并給出了總體架構(gòu)設(shè)計(jì),在對(duì)Ember.js、Spring MVC、Spring IoC、Activiti、Velocity、Spring AOP、JPA這些當(dāng)前業(yè)界主流框架研究使用的基礎(chǔ)上,對(duì)開發(fā)平臺(tái)的各層結(jié)構(gòu)進(jìn)行了設(shè)計(jì)與實(shí)現(xiàn),使各種框架各施其職同時(shí)無縫整合在一個(gè)平臺(tái)下,為企業(yè)提供了一個(gè)更高層次的應(yīng)用開發(fā)框架。
文中的開發(fā)平臺(tái)采用經(jīng)典的J2EE分層架構(gòu)思想,并結(jié)合當(dāng)前Web應(yīng)用系統(tǒng)的主流開發(fā)技術(shù),將架構(gòu)模型劃分為4層,如圖1所示,從左到右依次為表現(xiàn)層、控制層、業(yè)務(wù)層和持久層,層間的雙向箭頭為數(shù)據(jù)流。各層的設(shè)計(jì)與實(shí)現(xiàn)將在第2至5節(jié)進(jìn)行詳細(xì)描述。
表現(xiàn)層的作用是向用戶呈現(xiàn)Web應(yīng)用系統(tǒng)界面并提供交互操作。為使本文的開發(fā)平臺(tái)及由此衍生的Web應(yīng)用系統(tǒng)具有良好的用戶體驗(yàn),同時(shí)要便于模塊化開發(fā),本文在表現(xiàn)層引入了MVC的概念,并使用JavaScriptMVC框架Ember.js作為JSP頁面的核心組件。Ember.js通過分離模型、視圖和控制器,將雜亂的JavaScript代碼分層組織,增強(qiáng)了代碼的可維護(hù)性[2]。圖2為表現(xiàn)層的總體架構(gòu)圖,在Ember.js視圖中,Handlebars模板庫(kù)用于動(dòng)態(tài)生成JSP頁面,jQuery用于提供對(duì)Ajax的支持,jQuery UI用于實(shí)現(xiàn)Tabs、列表、對(duì)話框、拖放、日期選擇等效果,jQuery Upload Plugin用于提供多文件上傳功能,jQuery Validation Plugin用于對(duì)表單數(shù)據(jù)進(jìn)行驗(yàn)證。當(dāng)Ember.js視圖接收到瀏覽器事件時(shí)會(huì)將其傳遞給Ember.js控制器,經(jīng)過處理后控制器會(huì)將結(jié)果發(fā)送給Ember.js數(shù)據(jù)模型以保存變更。Ember.js與控制層的Spring MVCAPI進(jìn)行交互,通過異步請(qǐng)求方式從服務(wù)器端獲取JSON數(shù)據(jù),在更新JSP頁面中的多個(gè)部分時(shí)也無需加載新的頁面。
圖1 開發(fā)平臺(tái)總體架構(gòu)
圖2 表現(xiàn)層總體架構(gòu)圖
控制層相當(dāng)于Web應(yīng)用系統(tǒng)的調(diào)度中心,負(fù)責(zé)處理來自表現(xiàn)層的請(qǐng)求并調(diào)度業(yè)務(wù)層執(zhí)行相應(yīng)的操作。本文的開發(fā)平臺(tái)采用Spring MVC來構(gòu)建控制層。Spring MVC是J2EE開發(fā)中主流的開源MVC框架,是Spring的MVC實(shí)現(xiàn),具有松耦合的特點(diǎn)[3]。Spring MVC提供了注解配置的方式,可減少大量XML配置文件,例如,“@Controller”用于對(duì)MVC的控制器類進(jìn)行注釋以處理HTTP請(qǐng)求、“@RequestMapping”用于定義用戶請(qǐng)求的URL,等等。Spring MVC以DispatcherServlet為核心控制器實(shí)現(xiàn)了整個(gè)控制層的調(diào)度機(jī)制,開發(fā)人員只需關(guān)注自定義控制器Controller的實(shí)現(xiàn),主要處理流程如下:
1)當(dāng)應(yīng)用服務(wù)器啟動(dòng)后,分發(fā)器DispatcherServlet會(huì)根據(jù)配置文件內(nèi)容進(jìn)行組件初始化,等待用戶請(qǐng)求。當(dāng)接收到用戶請(qǐng)求時(shí),DispatcherServlet根據(jù)控制器映射 Handler Mapping定位控制器Controller并轉(zhuǎn)發(fā)請(qǐng)求;
2)Controller創(chuàng)建 Mode1AndView對(duì)象并對(duì)業(yè)務(wù)邏輯處理結(jié)果進(jìn)行封裝,返回給DispatcherServlet;
3)在DispatcherServlet解析時(shí),如果Mode1AndView對(duì)象封裝了View對(duì)象,則直接渲染視圖并返回給用戶,如果封裝了邏輯視圖名,則需視圖解析器ViewResolver將邏輯視圖名解析成View對(duì)象再進(jìn)行渲染。
另外,表現(xiàn)層和控制層之間是以JSON數(shù)據(jù)格式進(jìn)行交互的,但控制層及以下層次的數(shù)據(jù)類型均為Java對(duì)象,需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,對(duì)此,Spring MVC已提供了內(nèi)置支持。如圖3的代碼片段所示,應(yīng)用注解@RequestBody和@ResponseBody將觸發(fā)內(nèi)置轉(zhuǎn)換器MappingJacksonHttpMessageConverter實(shí)現(xiàn)JSON數(shù)據(jù)到對(duì)象demo1和對(duì)象demo2到JSON數(shù)據(jù)的轉(zhuǎn)換。
圖3 數(shù)據(jù)轉(zhuǎn)換代碼片段
業(yè)務(wù)層是Web應(yīng)用系統(tǒng)的核心所在,是業(yè)務(wù)處理邏輯的真正實(shí)現(xiàn)部分。業(yè)務(wù)層以Spring Framework為支撐,以便開發(fā)人員開發(fā)核心業(yè)務(wù)邏輯并管理Java類之間的依賴關(guān)系。由于該層的開發(fā)內(nèi)容和具體需求之間的聯(lián)系非常緊密,變化性強(qiáng),以通用解決方案為目標(biāo)的開發(fā)平臺(tái)難以對(duì)這些不確定的部分提供具體實(shí)現(xiàn),但可集成功能豐富的輔助模塊以減輕開發(fā)人員的工作負(fù)擔(dān),如流程管理、代碼生成和日志記錄。
4.1 流程管理
一般來說,Web應(yīng)用系統(tǒng)均會(huì)涉及流程管理,例如工作單從創(chuàng)建到發(fā)布可能需要經(jīng)過多個(gè)審批環(huán)節(jié),為此開發(fā)平臺(tái)提供了一個(gè)以Activiti為核心的流程管理模塊以輔助流程開發(fā)。Activiti是基于BPMN2.0標(biāo)準(zhǔn)開發(fā)的開源工作流引擎,包含BPMN2.0標(biāo)準(zhǔn)中大部分的執(zhí)行語義和圖元定義,并且集成了 Spring組件,可以在Spring或非Spring環(huán)境下使用[4]。Activiti使用標(biāo)準(zhǔn)的BPMN2.0流程定義文件來描述工作流的定義,這些文件可通過集成Activiti的可視化在線流程設(shè)計(jì)器ActivitiModeler來定制,并通過調(diào)用Activiti的Java編程API來應(yīng)用。如圖4所示,Activiti Java API的核心是Process Engine,所有工作流Service都必須從ProcessEngine對(duì)象獲取。在程序初始執(zhí)行時(shí),ProcessEngine對(duì)象需通過Process EngineConfiguration類的靜態(tài)方法查找指定路徑下的activiti. cfg.xm l文件并根據(jù)配置文件中的屬性值進(jìn)行創(chuàng)建和初始化。
圖4 Activiti流程引擎API
4.2 代碼生成
基于Velocity模板引擎的代碼生成模塊可以幫助開發(fā)人員自動(dòng)生成業(yè)務(wù)對(duì)象的增加、刪除、修改和查詢等代碼并按Web應(yīng)用層次組織代碼文件,提高開發(fā)效率,增強(qiáng)系統(tǒng)的可維護(hù)性和可移植性。Velocity是一個(gè)以Java語言編寫的開源模板引擎,可以獨(dú)立產(chǎn)生源代碼,也可以和其他系統(tǒng)集成以提供代碼生成技術(shù)支持[5]。
圖5 代碼生成模塊總體架構(gòu)圖
如圖5所示,代碼生成模塊主要由數(shù)據(jù)解析模塊、代碼生成引擎和文件輸出模塊這三部分組成,輸入為開發(fā)人員按規(guī)則定義的業(yè)務(wù)對(duì)象數(shù)據(jù)文件,輸出為與該對(duì)象對(duì)應(yīng)的表現(xiàn)層、控制層、業(yè)務(wù)層和持久層的增加、刪除、修改和查詢等操作代碼的JSP、Java文件以及必要的Spring配置文件。在執(zhí)行時(shí),數(shù)據(jù)解析模塊首先對(duì)業(yè)務(wù)對(duì)象數(shù)據(jù)文件進(jìn)行解析處理,獲得數(shù)據(jù)模型后,再由代碼生成引擎根據(jù)業(yè)務(wù)對(duì)象數(shù)據(jù)從模板庫(kù)加載模板文件并翻譯,最后由文件輸出模塊生成目標(biāo)代碼文件。
4.3 日志記錄
日志記錄模塊可滿足Web應(yīng)用系統(tǒng)維護(hù)的需要,通過應(yīng)用Spring AOP技術(shù)切入到各層代碼中。本文的日志記錄模塊主要由Logger和Formatter這兩個(gè)核心類組成。Logger是日志記錄器,負(fù)責(zé)保存日志對(duì)象和定義日志級(jí)別,日志級(jí)別包括:系統(tǒng)異常為Error、業(yè)務(wù)操作為Info、數(shù)據(jù)庫(kù)操作為Debug,等等。Formatter負(fù)責(zé)格式化日志信息的輸出和指定日志輸出的位置,如文件、控制臺(tái)和數(shù)據(jù)庫(kù)等。
持久層包括實(shí)體和DAO。實(shí)體與關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)表相映射,實(shí)體的實(shí)例對(duì)應(yīng)數(shù)據(jù)表中的記錄,它們之間的映射同樣可以采用注解來配置。EJB 3.0的JPA(Java Persistence API)定義了多種用于O/R映射的注解,可完全替代系統(tǒng)中的映射配置文件(如Hibernate的*.hbm.xm l)[6]。注解可以加在類定義、屬性定義及屬性get方法上,如圖6中的代碼片段所示。在圖6中,IdEntity為所有實(shí)體類的抽象父類,其實(shí)現(xiàn)了序列化接口并提供了主鍵映射。User及其它實(shí)體類繼承IdEntity,通過注解@Table和@Column實(shí)現(xiàn)實(shí)體及其屬性與數(shù)據(jù)表及列的映射。此外,實(shí)體間的關(guān)系還可通過@OneToOne、@OneToMany等注解來映射到數(shù)據(jù)庫(kù)的關(guān)系數(shù)據(jù)模型中。
圖6 實(shí)體類代碼片段
DAO將數(shù)據(jù)訪問與其他業(yè)務(wù)邏輯分離以提供對(duì)實(shí)體的增、刪、改、查操作。Spring以模板的方式實(shí)現(xiàn)對(duì)DAO的支持,模板中已包含通用的操作,對(duì)于自定義的操作可通過繼承來擴(kuò)展。Spring為JPA提供的DAO支持類是JpaDaoSupport,實(shí)際的數(shù)據(jù)庫(kù)訪問由模板類JpaTemplate來完成。圖7為文中采用的DAO類圖,其中,CommonDAO對(duì)JpaDaoSupport進(jìn)行了擴(kuò)展并定義了通用操作,其它DAO類設(shè)計(jì)和DemoDAO基本一致。
圖7 DAO類圖
圖8為文中基于整合框架實(shí)現(xiàn)的Web應(yīng)用系統(tǒng)開發(fā)平臺(tái),該平臺(tái)在整合前述各層設(shè)計(jì)的基礎(chǔ)上,還實(shí)現(xiàn)了登入登出、用戶管理、角色管理、部門管理、菜單管理和圖標(biāo)管理等通用功能,結(jié)合代碼生成和流程設(shè)計(jì)這兩個(gè)功能強(qiáng)大的模塊,開發(fā)人員可以輕易實(shí)現(xiàn)“模塊化擴(kuò)展功能,結(jié)構(gòu)化組織代碼”目標(biāo),進(jìn)而快速開發(fā)出所需的Web應(yīng)用系統(tǒng)。
圖8 Web應(yīng)用系統(tǒng)開發(fā)平臺(tái)
文中設(shè)計(jì)并實(shí)現(xiàn)的基于整合框架的Web應(yīng)用系統(tǒng)開發(fā)平臺(tái)以J2EE分層架構(gòu)思想為指導(dǎo),無縫整合了多種優(yōu)秀的開源框架并集成了通用的開發(fā)模塊,其中,表現(xiàn)層使用JavaScriptMVC框架Ember.js,以便開發(fā)富客戶端應(yīng)用,捉升用戶休驗(yàn);控制層采用Spring MVC框架,實(shí)現(xiàn)請(qǐng)求調(diào)度和數(shù)據(jù)轉(zhuǎn)換;業(yè)務(wù)層由Spring容器實(shí)現(xiàn),完成Web應(yīng)用系統(tǒng)的依賴注入、日志記錄等功能,并集成Activiti流程引擎和Velocity模板引擎以大大增強(qiáng)平臺(tái)的功能擴(kuò)展能力;持久層采用JPA框架作為持久化方案,簡(jiǎn)化了持久化配置并使得平臺(tái)架構(gòu)獲得了更大的可移植性。
目前文中的開發(fā)平臺(tái)已應(yīng)用于某供電局的建議管理系統(tǒng)、數(shù)據(jù)上報(bào)系統(tǒng)等Web應(yīng)用系統(tǒng)的開發(fā)中,實(shí)踐表明可以大幅提升開發(fā)人員的工作效率,并且可以根據(jù)業(yè)務(wù)需求變化在既有平臺(tái)上靈活添加、刪減和修改功能,有效降低了企業(yè)開發(fā)和維護(hù)Web應(yīng)用系統(tǒng)的成本。
[1]RodJohnson.J2EE Developmentwithout EJB[M].北京:電子工業(yè)出版社,2005.
[2]MacCaw,A.著.基于MVC的JavaScriptWeb富應(yīng)用開發(fā)[M].李晶,張散集譯.北京:電子工業(yè)出版社,2012.
[3]RobHarrop,JonMaehaeek著.Spring專業(yè)開發(fā)指南[M]. Redsaga翻譯小組譯.北京:電子工業(yè)出版社,2006.
[4]楊恩雄.瘋狂Workflow講義—基于Activiti的工作流應(yīng)用開發(fā)[M].北京:電子工業(yè)出版社,2014.
[5]李曉黎,張曉輝.Velocity網(wǎng)頁程序設(shè)計(jì)[M].北京:人民郵電出版社,2001.
[6]馮曼菲.EJB JPA數(shù)據(jù)庫(kù)持久層開發(fā)實(shí)踐詳解[M].北京:電子工業(yè)出版社,2008.
Design and implementation of development platform for W eb application systems based on integrated framework
LIN Yu-jie,WU Li-xian
(Foshan Power Supply Bureau,Guangdong Power Grid Limited Corporation,F(xiàn)oshan 528000,China)
In the face of increasingly complex Web application systems and frequently changed user requirements,the enterprisesneed to choose a feasible solution form numerous and complicated development frameworks so as tomaintain high efficiency and quality of development work.For this purpose,this paper constructs a development platform for rapid developmentofWeb application systems based on J2EE layered architecture.In presentation layer,Ember.js is implemented asynchronous refresh on partial page of JSP.In control layer,it is achieved with Spring MVC.In business layer,Activiti process engine and Velocity template engine are integrated on the basis of Spring Framework.In persistence layer,JPA is adopted to implement interactive with databases.It has been proved that the Web application systems constructed form the developmentplatform have the characteristics of low coupling degree between layers and high reusability formodules,which improve the developmentefficiency and reduce the costofdevelopmentandmaintenance greatly.
Web application system;development platform;MVC;Spring
TN99
A
1674-6236(2016)20-0062-04
2015-09-30 稿件編號(hào):201509196
林鈺杰(1987—),男,廣東佛山人,碩士研究生。研究方向:營(yíng)配信息集成、信息系統(tǒng)開發(fā)和管理。