蘇小平
摘要:該文分析了JAVA開源架構(gòu)Struts2、Spring和Hibernate各自的特點(diǎn),提出了將這三種架構(gòu)進(jìn)行整合的SSH2組合框架,介紹了該組合框架的詳細(xì)架構(gòu)和框架優(yōu)點(diǎn),并詳細(xì)描述了采用SSH2組合框架構(gòu)建JAVA Web應(yīng)用程序的過程。
關(guān)鍵詞:Struts;Spring;Hibernate;框架;SSH
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)28-0103-04
隨著信息技術(shù)和Internet的發(fā)展,基于JAVA的Web技術(shù)在各行各業(yè)得到廣泛應(yīng)用。在進(jìn)行軟件開發(fā)時(shí),為了降低開發(fā)成本和開發(fā)周期,也為了使軟件開發(fā)人員能夠?qū)⒏嗟木杏跇I(yè)務(wù)需求的研發(fā)減少底層代碼的開發(fā)工作,選用良好的開發(fā)框架顯得尤為重要?;贘ava的開源架構(gòu)有很多,通常情況下,選用何種架構(gòu)跟項(xiàng)目規(guī)模有直接關(guān)系。對于大型或者超大型的企業(yè)級項(xiàng)目,建議采用Java EE的EJB技術(shù)。對于需要快速開發(fā)的中小型項(xiàng)目,采用輕量級的框架技術(shù)更符合實(shí)際需要。現(xiàn)在有許多優(yōu)秀的開源的Web開發(fā)框架,例如,用于進(jìn)行數(shù)據(jù)持久化的Hibernate和JFinal、用于進(jìn)行權(quán)限設(shè)計(jì)的Shiro以及具有豐富標(biāo)簽庫的Struts2等,在進(jìn)行Web應(yīng)用程序開發(fā)時(shí),我們可以選用其中某一個(gè)架構(gòu),也可以將這些架構(gòu)整合起來使用。目前比較流行的是采用SSH2(Struts2+Spring+Hibernate)組合框架構(gòu)建JAVA Web應(yīng)用程序,表示層使用具有豐富taglib標(biāo)簽庫的Struts2技術(shù),持久層采用Hibernate框架對數(shù)據(jù)進(jìn)行持久化操作,業(yè)務(wù)層采用Spring框架在層與層之間解耦。
1 關(guān)鍵技術(shù)介紹
1.1 Struts2
Struts最早于2000年5月作為Jakarta項(xiàng)目的組成部分,Struts1框架是在 JSP Model2基礎(chǔ)上實(shí)現(xiàn)的MVC(Model-View-Controller)框架,它是世界上第一個(gè)發(fā)布的MVC框架。由于Struts1與JSP和Servlet的緊耦合性導(dǎo)致它存在很多缺陷,也制約了其發(fā)展,從而呼喚Struts2的出現(xiàn)。
Struts2與Struts1在本質(zhì)上有很大的區(qū)別,它沒有使用Struts1的設(shè)計(jì)核心,而是基于WebWork進(jìn)行架構(gòu)設(shè)計(jì),它是第二代基于MVC模型的Web應(yīng)用框架。Struts2不僅擁有功能強(qiáng)大的表達(dá)式語言和豐富的標(biāo)簽庫,還可以通過攔截器對用戶請求進(jìn)行處理,從而對業(yè)務(wù)邏輯控制器和Servlet進(jìn)行分離,降低程序的耦合性。
1.2 Spring
Spring是為了解決Web應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的,極大地簡化了企業(yè)級系統(tǒng)的開發(fā)過程。它的核心技術(shù)包括兩個(gè)方面,一是反轉(zhuǎn)控制(Inverser of Control,IoC),另一個(gè)是面向切面編程(Aspect-Oriented Programming,AOP)。Spring是一個(gè)輕量級分層架構(gòu)框架,由7個(gè)模塊組成,分別是:Spring Core(核心容器)、Spring Context(應(yīng)用上下文模塊)、Spring AOP模塊、Spring DAO(JDBC抽象和DAO支持模塊)、Spring ORM(對象/關(guān)系映射集成模塊)、Spring Web模塊、Spring Web MVC模塊,這些模塊可以單獨(dú)使用,也可以與其他一個(gè)或多個(gè)模塊組合使用。
Spring中包含了非常豐富的內(nèi)容,包括表示層和數(shù)據(jù)層,它提供了許多原來只有EJB才能提供的功能(如聲明式的事務(wù)管理等),但Spring又無需運(yùn)行在EJB容器中。Spring本身就是一個(gè)容器,它可以對系統(tǒng)對象的生命周期進(jìn)行配置和管理。在SSH2組合框架中主要將Spring應(yīng)用于中間的業(yè)務(wù)層,使用接口松散耦合的JavaBeans實(shí)現(xiàn)的對象模型可以通過XML配置文件進(jìn)行組合。
1.3 Hibernate
Hibernate是一個(gè)開源的對象關(guān)系映射(Object-Relation Mapping,ORM)框架,是JAVA類與數(shù)據(jù)庫表進(jìn)行映射的工具,映射后持久化類的每個(gè)實(shí)例對應(yīng)數(shù)據(jù)庫表中的一行數(shù)據(jù)。Hibernate對JDBC進(jìn)行了輕量級封裝,以前使用JDBC將數(shù)據(jù)持久化到數(shù)據(jù)庫的過程是:先得到Connection,再得到Statement,然后調(diào)用Statement的execute方法執(zhí)行sql語句。這樣寫出的程序類似面向過程,而非面向?qū)ο?,并且程序中嵌套了很多sql腳本,使得程序員將大量精力放在如何編寫SQL語句上?,F(xiàn)在使用Hibernate框架通過面向?qū)ο蟮姆绞綄?shù)據(jù)進(jìn)行持久化,可以讓Hibernate幫我們生成相應(yīng)的SQL語句,程序員只需要操作對象就可以對數(shù)據(jù)庫表進(jìn)行增刪改查操作。
2 SSH2組合框架
在進(jìn)行軟件開發(fā)時(shí)使用成熟的框架就相當(dāng)于讓別人幫你完成了一些基礎(chǔ)的工作,使用Struts2、Spring和Hibernate這3種優(yōu)秀的輕量級框架組成的SSH2組合框架可以充分發(fā)揮各個(gè)框架在Web應(yīng)用不同層面的作用。
2.1 SSH2組合框架詳細(xì)架構(gòu)
SSH2組合框架分為三層:分別是持久層、業(yè)務(wù)層和表現(xiàn)層。每層具有明確的責(zé)任,數(shù)據(jù)層使用Hibernate對數(shù)據(jù)庫進(jìn)行增刪改查操作,業(yè)務(wù)層使用Spring框架實(shí)現(xiàn)松耦合,表現(xiàn)層使用Struts2負(fù)責(zé)頁面的請求和轉(zhuǎn)發(fā)等。SSH2組合框架示意圖如圖1所示。
持久層:通過Hibernate的ORM將關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)映射成對象,從而實(shí)現(xiàn)以面向?qū)ο蠓绞讲僮鲾?shù)據(jù)庫。具體過程是,首先分析模塊所要涉及的表,確定表之間的關(guān)系后進(jìn)行數(shù)據(jù)庫設(shè)計(jì),然后用Hibernate提供的工具將數(shù)據(jù)表轉(zhuǎn)化為POJO對象,再用面向?qū)ο蟮姆绞竭M(jìn)一步操作這些對象以達(dá)到對數(shù)據(jù)的持久化控制。
業(yè)務(wù)層:位于三層架構(gòu)的中間層,主要由Spring負(fù)責(zé)業(yè)務(wù)層處理。利用Spring的IOC容器實(shí)現(xiàn)功能模塊的松耦合相連,利用Spring的AOP將業(yè)務(wù)邏輯從系統(tǒng)服務(wù)(如監(jiān)控和事務(wù)處理)中分離出來,從而實(shí)現(xiàn)內(nèi)聚開發(fā)。
表現(xiàn)層:表現(xiàn)層采用Struts2框架對用戶請求進(jìn)行響應(yīng)。Struts2提供了豐富的Taglib標(biāo)記庫,極大地提高了開發(fā)效率,并且具有頁面導(dǎo)航優(yōu)勢,通過一個(gè)配置文件struts.xml就可以把握整個(gè)系統(tǒng)各部分之間的關(guān)系,便于后期的維護(hù)和管理。
2.2 SSH2框架的優(yōu)點(diǎn)
基于SSH2的Web應(yīng)用架構(gòu)整合了Struts2、Spring和Hibernate這3個(gè)輕量級的開源框架,具有如下優(yōu)點(diǎn):
1)屬于開源架構(gòu),開發(fā)者可以更深入了解其內(nèi)部實(shí)現(xiàn)機(jī)制和原理。
2)符合典型的三層架構(gòu)模式,表現(xiàn)層、業(yè)務(wù)層和數(shù)據(jù)層架構(gòu)層次分明,降低了層與層之間的耦合性。
3)采用MVC模式對業(yè)務(wù)邏輯層、數(shù)據(jù)層和表現(xiàn)層進(jìn)行分離,所有業(yè)務(wù)邏輯都在Service中處理,有利于系統(tǒng)的開發(fā)和維護(hù)。
4)SSH已經(jīng)把底層實(shí)現(xiàn)封裝好了,軟件開發(fā)者不僅可以在此基礎(chǔ)上實(shí)現(xiàn)快速,而且可以更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。
5)配置靈活,支持國際化,并且具有很高的重用性。
6)擴(kuò)展性強(qiáng),通過配置文件的形式實(shí)現(xiàn)擴(kuò)展。
3 采用SSH2組合框架構(gòu)建Web應(yīng)用程序
使用SSH2組合框架進(jìn)行程序開發(fā),需要開發(fā)人員在IDE(例如MyEclipse)環(huán)境中正確導(dǎo)入并配置好Struts、Spring和Hibernate。搭建SSH2架構(gòu)的Web應(yīng)用環(huán)境,通常有兩種方式,一種方式是采用自底向上的方式搭建,即先導(dǎo)入Hibernate、再添加Spring支持,然后集成Struts2。另一種方式是采用自上而下的方式搭建,即先加載Struts2,然后添加Spring支持,再集成Hibernate。下面我們著重介紹采用自上而下的方式搭建SSH2開發(fā)架構(gòu)的過程。
3.1 新建工程,并創(chuàng)建數(shù)據(jù)庫連接
開始一個(gè)新的項(xiàng)目, 通常需要先新建工程,另外大多數(shù)Web項(xiàng)目都需要用到數(shù)據(jù)庫,故而新建工程后要?jiǎng)?chuàng)建數(shù)據(jù)庫連接。首先在MyEclipse開發(fā)環(huán)境中新建Web Project工程,然后添加數(shù)據(jù)連接。以創(chuàng)建oracle數(shù)據(jù)連接為例,過程如下:
1)點(diǎn)擊
2)在左側(cè)的DB Browser中,點(diǎn)擊鼠標(biāo)右鍵,選擇“New”,彈出如圖2所示菜單;
3)在圖2中,填寫數(shù)據(jù)庫相關(guān)信息并添加驅(qū)動類庫ojdbc14.jar;
4)點(diǎn)擊圖2中的“Test Driver”,提示數(shù)據(jù)庫連接成功即可。
3.2 添加Struts2支持
1)添加Struts2的jar包
首先在新建的工程中添加Struts2的jar包struts2-core-2.1.6.jar
2)創(chuàng)建struts.xml文件
在工程的src目錄下創(chuàng)建struts.xml文件,該文件是Struts2的核心配置文件,用于管理和配置Action攔截器和邏輯視圖映射等,在程序運(yùn)行時(shí)該文件會被Struts2框架自動加載。
3)添加核心過濾器
在工程的web.xml文件,添加Struts2的核心過濾器FilterDispatcher,代碼如下:
3.3 添加Spring支持
1)通過IDE環(huán)境添加Spring的jar包
在MyEclipse視圖下,點(diǎn)擊IDE環(huán)境左側(cè)的工程名,然后選擇”MyEclipse””Add Spring Capabilities…”,為新建的工程添加Spring支持,如圖3所示,主要添加Spring 2.5 AOP Librabries、Spring 2.5 Core Librabries、Spring 2.5 Persistence Core Librabries、Spring 2.5 Persistence JDBC Librabries、Spring 2.5 web Librabries這5個(gè)包。
點(diǎn)擊圖3中的“Next”按鈕,打開圖4所示窗口添加Spring bean的配置文件applicationContext.xml,該文件必須放置到WebRoot/WEB-INF目錄下,以便于通過web.xml進(jìn)行加載。
2)配置web.xml文件,添加Spring監(jiān)聽器
在web.xml文件,添加Spring監(jiān)聽器的代碼如下:
3.4 添加Hibernate支持
1)通過IDE環(huán)境添加Hibernate的jar包
在MyEclipse視圖下,點(diǎn)擊IDE環(huán)境左側(cè)的工程名,然后選擇 “MyEclipse””Add Hibernate Capabilities…”,為新建的工程添加Hibernate支持,如圖5所示。
2)配置Hibernate
點(diǎn)擊圖5中“Next”按鈕,進(jìn)入圖6所示的“Hibernate Configuration”頁面,對Hibernate進(jìn)行初步配置。選中“Spring configuration file(applicationContext.xml)”單選框,意味著我們將會使用Spring中的applicationContext.xml文件對Hibernate Bean進(jìn)行管理。
點(diǎn)擊圖6中的“Next”按鈕,對Hibernate進(jìn)行進(jìn)一步配置,如圖7所示,選中“Exiting Spring Contfiguration file”單選框,文本框中輸入“SessionFactory”。
1)添加數(shù)據(jù)源
點(diǎn)擊圖7中的“Next”按鈕,彈出圖8所示的添加數(shù)據(jù)源窗口,指定一個(gè)新的Spring數(shù)據(jù)連接。具體配置如圖8所示,DB Driver處選擇我們前面配置好的數(shù)據(jù)源oracledriver即可。
點(diǎn)擊圖8中的“Next”按鈕,在彈出的圖9窗口中取消勾選”Create SessionFactory class”選項(xiàng) ,點(diǎn)擊”Finish”按鈕即完成Hibernate添加。
這時(shí),我們的工程完整的添加了Struts、Spring和Hibernate支持,開發(fā)環(huán)境搭建完畢,就可以進(jìn)一步編寫業(yè)務(wù)需求的實(shí)現(xiàn)代碼了。
4 結(jié)束語
在進(jìn)行JAVA Web工程開發(fā)時(shí),Web應(yīng)用框架的選擇非常重要。本文在深入研究和細(xì)致分析開源框架Struts2、Spring和Hibernate的基礎(chǔ)上,根據(jù)Web應(yīng)用的分層原則,提出采用SSH2組合框架自上而下構(gòu)建Web應(yīng)用程序的方式。使用這種優(yōu)秀的解耦架構(gòu)不僅可以提高開發(fā)效率,縮短開發(fā)周期,節(jié)約開發(fā)成本,而且對后期不斷的需求變更能夠更好地適應(yīng),在多個(gè)項(xiàng)目實(shí)施過程中,該組合框架也表現(xiàn)出了良好的性能。
參考文獻(xiàn):
[1] Oh snap! [EB/OL].http://hibernate.org/hibesdocs/reference/zh-cnlhtml.
[2] 孫鑫. Struts2深入詳解[M]. 北京: 電子工業(yè)出版社, 2009.
[3] 王福強(qiáng). Spring揭秘[M]. 北京: 人民郵電出版社, 2009.
[4] 孫衛(wèi)琴. 精通 Hibernate:Java 對象持久化技術(shù)詳解[M]. 2版.北京: 電子工業(yè)出版社, 2010.
[5] 李剛. 輕量級JavaEE企業(yè)應(yīng)用實(shí)戰(zhàn)——struts2+Spring+Hibernate整合開發(fā)[M]. 北京: 電子工業(yè)出版社, 2008.