曹靜++李梅++付惠茹++李沂橋++嚴(yán)開(kāi)
摘 要針對(duì)當(dāng)前Web應(yīng)用程序開(kāi)發(fā)面臨的問(wèn)題,結(jié)合目前比較流行的開(kāi)源框架Spring、Struts和Hibernate,提出了一種開(kāi)發(fā)J2EE Web應(yīng)用的輕量級(jí)解決方案,以幫助開(kāi)發(fā)人員在短期內(nèi)搭建結(jié)構(gòu)清晰、可復(fù)用性好、維護(hù)方便的Web應(yīng)用程序。通過(guò)分析Struts、Spring、Hibernate各個(gè)框架自身的特點(diǎn),優(yōu)勢(shì)和不足,依照需求對(duì)框架進(jìn)行組合搭建,以MVC分層思想實(shí)現(xiàn)Web系統(tǒng)上的不同分層,表示層用Struts實(shí)現(xiàn),用Hibernate框架將實(shí)現(xiàn)數(shù)據(jù)的持久化,業(yè)務(wù)邏輯層用Spring框架實(shí)現(xiàn),同時(shí)對(duì)SSH整合框架的整體性能進(jìn)行了改進(jìn)和優(yōu)化。引入框架技術(shù),大大降低了企業(yè)的開(kāi)發(fā)成本,同時(shí)提高了開(kāi)發(fā)效率。
【關(guān)鍵詞】SSH J2EE 面向?qū)ο?Web開(kāi)發(fā)
大型企業(yè)級(jí)Web應(yīng)用系統(tǒng)的開(kāi)發(fā)通常要求有一個(gè)良好的軟件架構(gòu)、便于協(xié)作開(kāi)發(fā)和擴(kuò)展升級(jí),而傳統(tǒng)的開(kāi)發(fā)模式不能很好地滿(mǎn)足這些要求。本文針對(duì)當(dāng)前Web應(yīng)用程序開(kāi)發(fā)面臨的問(wèn)題,結(jié)合目前比較流行的開(kāi)源框架SSH(Spring、Struts、Hibernate),提出一種開(kāi)發(fā)J2EE 企業(yè)級(jí)Web應(yīng)用的輕量級(jí)解決方案,并通過(guò)案例具體說(shuō)明如何將這一方案應(yīng)用到實(shí)際項(xiàng)目中。
1 框架技術(shù)
框架一般具有即插即用的可重用性、成熟的穩(wěn)定性以及良好的團(tuán)隊(duì)協(xié)作性。J2EE復(fù)雜的多層結(jié)構(gòu)決定了大型的J2EE項(xiàng)目需要運(yùn)用框架和設(shè)計(jì)模式來(lái)控制軟件質(zhì)量。目前,市場(chǎng)上出現(xiàn)了一些商業(yè)的、開(kāi)源的基于J2EE的應(yīng)用框架,其中主流的框架技術(shù)有:基于MVC模式的Struts框架和基于IoC模式的Spring框架以及對(duì)象/關(guān)系映射框架Hibernate等。
1.1 表示層框架Struts
Struts是一個(gè)在JSP Model2基礎(chǔ)上實(shí)現(xiàn)的MVC框架,主要分為模型(Model)、視圖(Viewer)和控制器(Controller)三部分,其主要的設(shè)計(jì)理念是通過(guò)控制器將表現(xiàn)邏輯和業(yè)務(wù)邏輯解耦,以提高系統(tǒng)的可維護(hù)性、可擴(kuò)展性和可重用性。Struts框架的體系結(jié)構(gòu)如下:
1.1.1 視圖
視圖部分主要由JSP頁(yè)面組成,其中沒(méi)有流程邏輯、業(yè)務(wù)邏輯和模型信息,只有標(biāo)記。Struts自身包含了一組標(biāo)記庫(kù)(TagLib),這也是Struts的精華之一,靈活運(yùn)用它們可以簡(jiǎn)化JSP頁(yè)面的代碼,提高開(kāi)發(fā)效率。
1.1.2 控制器
Struts中的Controller主要是其自身提供的ActionServlet。ActionServlet接收所有來(lái)自客戶(hù)端的請(qǐng)求并根據(jù)配置文件(struts-config.xml)中的定義將控制轉(zhuǎn)移到適當(dāng)?shù)腁ction對(duì)象。
1.1.3 模型
Struts沒(méi)有定義具體Model層的實(shí)現(xiàn),Model層通常是和業(yè)務(wù)邏輯緊密相關(guān)的,有持續(xù)化的要求。目前在商業(yè)領(lǐng)域和開(kāi)源世界,都有一些優(yōu)秀的工具可以為Model層的開(kāi)發(fā)提供便利。
1.2 業(yè)務(wù)邏輯層框架Spring
Spring是一個(gè)解決了許多J2EE開(kāi)發(fā)中常見(jiàn)問(wèn)題并能夠替代EJB技術(shù)的強(qiáng)大的輕量級(jí)框架。這里所說(shuō)的輕量級(jí)指的是Spring框架本身,而不是指Spring只能用于輕量級(jí)的應(yīng)用開(kāi)發(fā)。Spring的輕盈體現(xiàn)在其框架本身的基礎(chǔ)結(jié)構(gòu)以及對(duì)其他應(yīng)用工具的支持和裝配能力。與EJB這種龐然大物相比,Spring可使程序研發(fā)人員把各個(gè)技術(shù)層次之間的風(fēng)險(xiǎn)降低。
Spring框架的核心是控制翻轉(zhuǎn)IoC(Inversion of Control)/依賴(lài)注入DI(Dependence Injection)機(jī)制。IoC是指由容器中控制組件之間的關(guān)系(這里,容器是指為組件提供特定服務(wù)和技術(shù)支持的一個(gè)標(biāo)準(zhǔn)化的運(yùn)行時(shí)的環(huán)境)而非傳統(tǒng)實(shí)現(xiàn)中由程序代碼直接操控,這種將控制權(quán)由程序代碼到外部容器的轉(zhuǎn)移,稱(chēng)為“翻轉(zhuǎn)”。DI是對(duì)IoC更形象的解釋?zhuān)从扇萜髟谶\(yùn)行期間動(dòng)態(tài)地將依賴(lài)關(guān)系(如構(gòu)造參數(shù)、構(gòu)造對(duì)象或接口)注入到組件之中。Spring采用設(shè)值注入(使用Setter方法實(shí)現(xiàn)依賴(lài))和構(gòu)造子注入(在構(gòu)造方法中實(shí)現(xiàn)依賴(lài))的機(jī)制,通過(guò)配置文件管理組建的協(xié)作對(duì)象,創(chuàng)建可以構(gòu)造組件的IoC容器。這樣,不需要編寫(xiě)工廠(chǎng)模式、單例模式或者其他構(gòu)造的方法,就可以通過(guò)容器直接獲取所需的業(yè)務(wù)組件。
1.3 數(shù)據(jù)持久層框架Hibernate
O/R mapping技術(shù)是為了解決關(guān)系型數(shù)據(jù)庫(kù)和面向?qū)ο蟮某绦蛟O(shè)計(jì)之間不匹配的矛盾而產(chǎn)生的。Hibernate是目前最為流行的O/R mapping框架,它在關(guān)系型數(shù)據(jù)庫(kù)和Java對(duì)象之間做了一個(gè)自動(dòng)映射,使得程序員可以以非常簡(jiǎn)單的方式實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。
Hibernate通過(guò)對(duì)JDBC的封裝,向程序員屏蔽了底層的數(shù)據(jù)庫(kù)操作,使程序員專(zhuān)注于OO程序的開(kāi)發(fā),有助于提高開(kāi)發(fā)效率。程序員訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)所需要做的就是為持久化對(duì)象編制xml映射文件。
底層數(shù)據(jù)庫(kù)的改變只需要簡(jiǎn)單地更改初始化配置文件(hibernate.cfg.xml或者h(yuǎn)ibernate.properties)即可,不會(huì)對(duì)應(yīng)用程序產(chǎn)生影響。
Hibernate有自己的面向?qū)ο蟮牟樵?xún)語(yǔ)言HQL,HQL功能強(qiáng)大,支持目前大部分主流的數(shù)據(jù)庫(kù),如Oracle、DB2、MySQL、Microsoft SQL Server等,是目前應(yīng)用最廣泛的O/R映射工具。Hibernate為快速開(kāi)發(fā)應(yīng)用程序提供了底層的支持。
2 集成SSH的新型,輕量級(jí)的J2EE架構(gòu)
集成SSH框架的系統(tǒng)從職責(zé)上分為四層:表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層和域模塊層。其中使用Struts作為系統(tǒng)的整體基礎(chǔ)架構(gòu),負(fù)責(zé)MVC的分離,在Struts框架的模型部分,利用Hibernate框架對(duì)持久層提供支持,業(yè)務(wù)層用Spring支持。具體做法是:用面向?qū)ο蟮姆治龇椒ǜ鶕?jù)需求提出一些模型,將這些模型實(shí)現(xiàn)為基本的Java對(duì)象,然后編寫(xiě)基本的DAO接口,并給出Hibernate的DAO實(shí)現(xiàn),采用Hibernate架構(gòu)實(shí)現(xiàn)的DAO類(lèi)來(lái)實(shí)現(xiàn)Java類(lèi)與數(shù)據(jù)庫(kù)之間的轉(zhuǎn)換和訪(fǎng)問(wèn),最后由Spring完成業(yè)務(wù)邏輯。
系統(tǒng)的基本業(yè)務(wù)流程是: 在表示層中,首先通過(guò)JSP頁(yè)面實(shí)現(xiàn)交互界面,負(fù)責(zé)傳送請(qǐng)求(Request)和接收響應(yīng)(Response),然后Struts根據(jù)配置文件(struts-config.xml)將ActionServlet接收到的Request委派給相應(yīng)的Action處理。在業(yè)務(wù)層中,管理服務(wù)組件的Spring IoC容器負(fù)責(zé)向Action提供業(yè)務(wù)模型(Model)組件和該組件的協(xié)作對(duì)象數(shù)據(jù)處理(DAO)組件完成業(yè)務(wù)邏輯,并提供事務(wù)處理、緩沖池等容器組件以提升系統(tǒng)性能和保證數(shù)據(jù)的完整性。而在持久層中,則依賴(lài)于Hibernate的對(duì)象化映射和數(shù)據(jù)庫(kù)交互,處理DAO組件請(qǐng)求的數(shù)據(jù),并返回處理結(jié)果。
采用上述開(kāi)發(fā)模型,不僅實(shí)現(xiàn)了視圖、控制器與模型的徹底分離,而且還實(shí)現(xiàn)了業(yè)務(wù)邏輯層與持久層的分離。這樣無(wú)論前端如何變化,模型層只需很少的改動(dòng),并且數(shù)據(jù)庫(kù)的變化也不會(huì)對(duì)前端有所影響,大大提高了系統(tǒng)的可復(fù)用性。而且由于不同層之間耦合度小,有利于團(tuán)隊(duì)成員并行工作,大大提高了開(kāi)發(fā)效率。
通過(guò)查找文獻(xiàn)發(fā)現(xiàn)已經(jīng)應(yīng)用的組合框架有struts與spring組合和spring與hibernate組合。
2.1 struts與spring
優(yōu)點(diǎn):當(dāng)需要修改大量代碼時(shí),只需要修改spring的配置文件即可,提高代碼的復(fù)用性和可移植性,大大節(jié)省了開(kāi)大的周期。
缺點(diǎn):Action將會(huì)和Spring耦合在一起。如果有多個(gè)Action類(lèi)都繼承MappingDispatchActionSupport的話(huà)你將會(huì)每次都需要調(diào)用getWebApplicationContext()獲取ApplicationContext的實(shí)例。這樣如果放棄使用spring的話(huà),所要修改的代碼量將非常大。
2.2 Spring與hibernate
優(yōu)點(diǎn):Spring提供的是框架級(jí)的事務(wù)管理,在使用session.beginTransaction()或tx.commit()的時(shí)候就是使用了hibernate的API,這樣代碼就和hibernate耦合了。如果以后想用或JPA來(lái)代替hibernate做持久化工作,太多代碼需要改動(dòng),如果使用spring的事務(wù)控制,就不再需要在代碼中是用hibernate的API,同樣是用JTA或JPA來(lái)代替hibernate,只需要修改spring的配置文件就可以替換了持久層框架。
缺點(diǎn):由于對(duì)持久層封裝過(guò)于完整,導(dǎo)致開(kāi)發(fā)人員無(wú)法對(duì)SQL進(jìn)行優(yōu)化,無(wú)法靈活使用JDBC的原生SQL,Hibernate封裝了JDBC,所以沒(méi)有JDBC直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)效率高。要使用數(shù)據(jù)庫(kù)的特定優(yōu)化機(jī)制的時(shí)候,不適合用Hibernate 。
對(duì)于框架組合的一般方式進(jìn)行總結(jié)歸納,分析各自的優(yōu)缺點(diǎn)和適用條件,通過(guò)Spring與hibernate的組合方式,可以發(fā)現(xiàn)無(wú)法進(jìn)行SQL優(yōu)化,增加數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)時(shí)間等缺點(diǎn),針對(duì)這種組合存在的問(wèn)題,結(jié)合具體的需求實(shí)踐,我們提出了struts,spring,iBatis和struts,spring,jdbc的組合方式,然后結(jié)合具體實(shí)現(xiàn)的系統(tǒng)驗(yàn)證該組合模式的有效性。并通過(guò)后面的學(xué)習(xí)和實(shí)踐,分析和驗(yàn)證其他的框架組合模式。
3 研究方案及準(zhǔn)備采取的技術(shù)路線(xiàn)、擬解決的關(guān)鍵問(wèn)題
3.1 研究方案
根據(jù)Struts、Spring、Hibernate各個(gè)框架的功能和分層結(jié)構(gòu),對(duì)比研究分析出每個(gè)框架的適用條件和適用屬性,并且以一個(gè)具體實(shí)現(xiàn)的系統(tǒng)展現(xiàn)每個(gè)框架的應(yīng)用:
采用以下開(kāi)發(fā)工具:MyEclipse,Tomcat和MySQL數(shù)據(jù)庫(kù)
客戶(hù)端:采用jQuery標(biāo)簽和Struts框架為主要展示層,提供豐富的用戶(hù)交互UI功能,跨平臺(tái)的使用為用戶(hù)帶來(lái)無(wú)限便捷,并且為用戶(hù)帶來(lái)各種新穎的用戶(hù)體驗(yàn)。
數(shù)據(jù)交互通信層:采用Spring框架,使用統(tǒng)一的接口,實(shí)現(xiàn)數(shù)據(jù)由前端到后端的傳輸,增強(qiáng)數(shù)據(jù)的時(shí)效性。
數(shù)據(jù)存儲(chǔ)管理層:采用MySQL數(shù)據(jù)庫(kù)和Hibernate框架,對(duì)數(shù)據(jù)進(jìn)行持久化和SQL注入,通過(guò)Hibernate框架讓系統(tǒng)對(duì)數(shù)據(jù)庫(kù)的操作更簡(jiǎn)單方便。
3.2 技術(shù)路線(xiàn)
對(duì)比Struts、Spring、Hibernate各自框架的優(yōu)缺點(diǎn)、設(shè)計(jì)原則和運(yùn)行流程,分析各種組合框架的適用性。
Struts和Spring的整合,首先通過(guò)加載Spring的應(yīng)用環(huán)境Application,自動(dòng)獲取了Spring中設(shè)置的bean對(duì)象,將Struts中ActionServlet請(qǐng)求Action納入Spring容器中的方法將Struts和Spring整合起來(lái)。
Hibernate和Spring的整合主要是Spring對(duì)SessionFactory的管理。
3.3 擬解決的關(guān)鍵問(wèn)題
(1)采用jQuery和Struts框架技術(shù)實(shí)現(xiàn)頁(yè)面展示部分;
(2)搭建SSH框架,使框架可以運(yùn)行;
(3)采用Spring的IOC(控制反轉(zhuǎn)和依賴(lài)注入)技術(shù)實(shí)現(xiàn)容器動(dòng)態(tài)地將某種依賴(lài) 關(guān)系注入到組件之中;
(4)采用Hibernate技術(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)的持久化和對(duì)對(duì)象的直接操作;
(5)根據(jù)業(yè)務(wù)需求條件的不同,采用合適的框架組合。
4 結(jié)論
為了解決傳統(tǒng)基于J2EE架構(gòu)的Web應(yīng)用系統(tǒng)中的一些弊端,找到適用于企業(yè)級(jí)應(yīng)用軟件系統(tǒng)需求的特點(diǎn)和開(kāi)發(fā)方法,通過(guò)分析J2EE多層分布式架構(gòu)應(yīng)用模型,采用輕量級(jí)的SSH組合框架,并對(duì)組合框架的性能進(jìn)行改進(jìn)和優(yōu)化,最大化各個(gè)框架的自身優(yōu)勢(shì),以得到具備以下優(yōu)點(diǎn)的框架:
(1)重用設(shè)計(jì),用來(lái)簡(jiǎn)化設(shè)計(jì)的復(fù)雜性;
(2)重用代碼,用來(lái)減少編碼和測(cè)試的時(shí)間,縮短軟件開(kāi)發(fā)周期,提高開(kāi)發(fā)效率;
(3)提高應(yīng)用系統(tǒng)的可擴(kuò)展性、可維護(hù)性和可移植性;
(4)降低各層之間的藕合度。
為Web應(yīng)用開(kāi)發(fā)人員提供了一個(gè)能夠統(tǒng)一使用的開(kāi)發(fā)模式和軟件包,開(kāi)發(fā)人員不必關(guān)系底層的實(shí)現(xiàn)細(xì)節(jié),將工作重心放在應(yīng)用的業(yè)務(wù)邏輯處理上。減輕了開(kāi)發(fā)人員處理復(fù)雜問(wèn)題的負(fù)擔(dān),提高開(kāi)發(fā)效率。其次,在應(yīng)用和分析架構(gòu)的基礎(chǔ)上,可以進(jìn)行擴(kuò)展和改進(jìn),以適應(yīng)當(dāng)前應(yīng)用的需要,為以后的擴(kuò)展和維護(hù)奠定了基礎(chǔ)。
參考文獻(xiàn)
[1]萬(wàn)助盛,侯文永.J2EE企業(yè)計(jì)算平臺(tái)[J].計(jì)算機(jī)應(yīng)用研究,2013(12):38-40.
[2]張友生.軟件體系結(jié)構(gòu)[M].北京:北京清華大學(xué)出版社,2011(10).
[3]劉瑜,王立福.軟件框架開(kāi)發(fā)過(guò)程研究[J].計(jì)算機(jī)工程與應(yīng)用,2014.
[4]劉曉華,陳亞強(qiáng).應(yīng)用開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版社,2015.
[5]葉娜.J2EE Web應(yīng)用開(kāi)發(fā)中Struts框架的研究與擴(kuò)展[J].西安建筑科技大學(xué),2012.
[6]趙強(qiáng),喬新亮.J2EE應(yīng)用開(kāi)發(fā)[M].北京:電子工業(yè)出版社,2013.
[7]張友生.軟件體系結(jié)構(gòu)[M].北京:清華大學(xué)出版社,2014(10).
[8]薩師煊,王珊.數(shù)據(jù)庫(kù)系統(tǒng)概論(第三版)[M].北京:高等教育出版社,2013(12).
[9]熊偉.Java EE模式框架在中小企業(yè)Web實(shí)施應(yīng)用中的研究[D].成都:成都理工大學(xué),2015(06).
[10]孫鑫.Java Web開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版社,2015.
[11]寇毅,吳力文.基于MVC設(shè)計(jì)模式的Struts框架的應(yīng)用方法[J].計(jì)算機(jī)應(yīng)用,2013.
作者簡(jiǎn)介
曹靜(1989-),女,貴州省貴陽(yáng)市人。貴州大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院。主要研究方向?yàn)镴ava Web開(kāi)發(fā)。
作者單位
貴州大學(xué) 貴州省貴陽(yáng)市 550025