趙 洋 張 麗 王恩東 張素寧
摘 要:介紹Struts,Hibernate和Spring三個開源框架及它們對MVC設(shè)計模式的實現(xiàn),闡述如何更好地將三者結(jié)合起來構(gòu)建一個健壯、高效、易于擴展的J2EE分層架構(gòu),并給出該架構(gòu)的結(jié)構(gòu)圖,分析它的優(yōu)缺點,并且通過網(wǎng)上購物系統(tǒng)給出了這一框架的實現(xiàn)。
關(guān)鍵詞:Struts;MVC;Hibernate;Spring;J2EE;購物系統(tǒng)
中圖分類號:TP311.52文獻標(biāo)識碼:A
文章編號:1004 373X(2009)02 107 04
Research of J2EE Based on Struts,Hibernate and Spring
ZHAO Yang,ZHANG Li,WANG Endong,ZHANG Suning
(Shenyang Institute of Chemical Technology,Shenyang,110042,China)
Abstract:Three frameworks of Struts,Hibernate and Spring are introduced.The implement for MVC model based on the three frameworks is introduced.How to use the three frameworks more efficiency in building a strong,high efficiency and easy expanded J2EE,and the picture of this framework is given.The advantages and disadvantages are analyzed.Finally,the online shopping system,which is based on this framework is realized.
Keywords:Struts;MVC;Hibernate;Spring;J2EE;shopping system
0 引 言
目前,為了降低成本及開發(fā)系統(tǒng)的復(fù)雜性,加快應(yīng)用程序的開發(fā)和設(shè)計,面向企業(yè)應(yīng)用的體系結(jié)構(gòu)J2EE 平臺,提供了一種基于組件的方法,對于一個多層的應(yīng)用模型根據(jù)功能將其應(yīng)用邏輯劃分成組件。
MVC 設(shè)計模式,最早是在Smalltalk-80中被提出的。MVC即:模型(Model)、視圖(View)、控制器(Controller)。模型表示業(yè)務(wù)邏輯;視圖是應(yīng)用程序中用戶界面相關(guān)的部分;控制器的作用是從客戶端接收請求,并且選擇執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,然后把響應(yīng)結(jié)果送回到客戶端[1]。這種設(shè)計模式把應(yīng)用邏輯、處理過程和顯示邏輯分成不同的組件實現(xiàn),通過三者之間的分離達到層間的松散耦合以及各層內(nèi)部的緊密內(nèi)聚,以實現(xiàn)代碼重用和易于修改,以此來提高系統(tǒng)的靈活性、可重用性和可維護性,達到提高軟件質(zhì)量的目的。
1 開源框架Struts,Hibernate和Spring簡介
1.1 Web開發(fā)框架Struts
Struts是在JSP Model2的基礎(chǔ)上實現(xiàn)的一個MVC 模式的應(yīng)用程序的框架。它提供Controller 組件并且整合了其他技術(shù)實現(xiàn)Model和View。對于Model,Struts可以使用標(biāo)準數(shù)據(jù)訪問技術(shù),如JDBC和EJB, 也可以使用第三方工具, 如Hibernate,iBETIS,O/R 橋。至于View,Struts支持JSP 技術(shù),支持JSTL(JSP Standard Tag Liberary)和JSF(Java Server Faces),也可以使用Velocity模板、XSLT(the Extensible Stylesheet Langusge Transformations)及其他表示系統(tǒng)。此外,Struts 提供的自定義的標(biāo)簽庫可以輔助JSP進行表示層的設(shè)計。
Struts 的核心組件有ActionServlet,Action,ActionForm,ActionMapping,ActionForward及Taglib配置文件等。
1.2 對象關(guān)系映射工具Hibernate
Hibernate是目前流行的ORM(Object Relation Mapping)框架。它對JDBC進行了輕量級的對象封裝,使得Java程序員可以使用面向?qū)ο缶幊趟季S來操作后臺關(guān)系數(shù)據(jù)庫,而不用再去關(guān)心繁瑣的SQL語句。
Hibernate采用運行時反射(Runtime Reflection) 來決定一個類的持久化屬性[2] 。在企業(yè)級應(yīng)用中,由于需要頻繁地與數(shù)據(jù)庫交互,開發(fā)者往往在應(yīng)用和數(shù)據(jù)庫之間建立一個“持久層”(Persistence Layer),它負責(zé)應(yīng)用到數(shù)據(jù)庫的數(shù)據(jù)存儲,也負責(zé)數(shù)據(jù)的檢索和更新。在J2EE 的應(yīng)用中,這個持久層使用JDBC、實體Beans、JDO等技術(shù)來建立。但是JDBC中數(shù)據(jù)訪問對象(Databese Access Object,DAO)和SQL語句直接綁定在一起降低了可維護性,且不支持繼承和多態(tài)。Hibernate 的出現(xiàn)讓使用者又多了一個選擇,可以選用Hibernate 這種框架來實現(xiàn)對象、關(guān)系之間的映射和數(shù)據(jù)的持久化。Hibernate擁有強大的查詢語言(Hibernate Query Language,HQL),HQL完全是面向?qū)ο蟮模?]。
Hibernate的核心接口一共有5個,分別是:Session,SessionFactory,Configuration,Transaction和Query(或Criteria)。通過這些接口,不僅可以對持久化對象進行存取,還能夠進行事務(wù)控制。
1.3 Web開發(fā)框架Spring
Spring也是一個優(yōu)秀的Web開發(fā)框架。它解決了許多在J2EE開發(fā)中常見的問題的強大框架。它提供了管理業(yè)務(wù)對象的一致方法,并且鼓勵對接口的編程而不是對類編程的習(xí)慣。Spring的架構(gòu)基礎(chǔ)是基于使用JavaBean屬性的Inversion of Control容器,數(shù)據(jù)訪問架構(gòu)集成了Hibernate和其他O/R mapping解決方案,同時提供了對Struts的支持。它是一個分層的框架,由7個模塊組成[3]。Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理Bean的方式,如圖1所示。
組成Spring框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯(lián)合實現(xiàn)。
1.4 Struts,Hibernate和Spring對MVC模式的實現(xiàn)
Struts和Spring都是當(dāng)前流行的MVC實現(xiàn)框架,其中Struts 在View上實現(xiàn)較為突出,Spring在業(yè)務(wù)層實現(xiàn)較好,Hibernate在數(shù)據(jù)持久層實現(xiàn)較好。因此將三者結(jié)合起來,很好地實現(xiàn)了MVC 的設(shè)計模式,如圖2所示。
在這種結(jié)構(gòu)中,用戶從瀏覽器發(fā)出請求,該請求首先將被Struts的ActionServlet接收,然后ActionServlet會根據(jù)用戶的Struts配置確定應(yīng)觸發(fā)哪一個具體的Action。Action的主要任務(wù)是調(diào)用某一個業(yè)務(wù)邏輯對象BO(Business Object)已完成相應(yīng)的業(yè)務(wù)操作[4]。由于在該框架中考慮引入了Spring,因此Action將不必直接創(chuàng)建具體的BO,而是通過Spring框架利用反向注入的原理(Ioc)來得到BO的實例。
2 基于Struts,Hibernate和Spring三種框架的J2EE架構(gòu)
在項目開發(fā)中采用基于Struts,Hibernate和Spring三種框架的J2EE架構(gòu), 用JSP技術(shù)結(jié)合Struts強大的Taglib來實現(xiàn)表示層;Spring負責(zé)中間的業(yè)務(wù)層;Hibernate完成對象和關(guān)系的映射,并借助數(shù)據(jù)庫存儲技術(shù)來實現(xiàn)整個J2EE應(yīng)用。
分層設(shè)計思想是軟件設(shè)計中的一個重要的設(shè)計思想。在項目中,也利用這種分層的思想,設(shè)計出一種分層架構(gòu)。基于Struts,Hibernate和Spring框架的J2EE分層架構(gòu)如圖3所示。
由圖3可以看出,對于基于Struts,Hibernate和Spring框架的J2EE分層架構(gòu),基本上劃分了5層,詳細地說,來自客戶層的Web請求送到Struts框架中的控制器ActionServlet等候處理。ActionServlet包括一組基于配置的ActionMapping對象,每個ActionMapping對象實現(xiàn)了一個請求到一個具體的Model 部分中Action處理器對象之間的映射。ActionServlet接收客戶端的請求, 并將請求交與RequestProcessor來處理。RequestProcessor根據(jù)請求的URL,從ActionMapping中得到相應(yīng)的Action,并根據(jù)請求的參數(shù)實例化相應(yīng)的ActionForm,進行form驗證。驗證通過,則調(diào)用Action的Execute方法。在方法體內(nèi),調(diào)用業(yè)務(wù)邏輯模塊,由Hibernate在“幕后”完成與數(shù)據(jù)庫的交互。業(yè)務(wù)邏輯類里Hibernate把HQL轉(zhuǎn)換為SQL,通過O/R映射文件實現(xiàn)具體對數(shù)據(jù)源的操作,即穿過持久層映射到具體的數(shù)據(jù)庫表。Execute方法執(zhí)行后須返回ActionForward。ActionServlet接收Execute方法返回的ActionForward對象,轉(zhuǎn)發(fā)到ActionForward指定的源。
3 基于這種框架的系統(tǒng)實現(xiàn)
該購物系統(tǒng)采用這種基于Struts,Hibernate和Spring三種框架的J2EE架構(gòu)設(shè)計思想,采用Tomcat 5.0作為應(yīng)用服務(wù)器,以Eclipse 3.2作為前端開發(fā)工具。
(1) 購物車的實現(xiàn)。網(wǎng)上購物不同于一般的網(wǎng)上操作,客戶在瀏覽多個商品頁面,購物車維持的是整個購物過程結(jié)束之前的一系列狀態(tài)數(shù)據(jù),因此必須保證購物車實例在Session范圍內(nèi)有效。該系統(tǒng)運用的是將購物車封裝進有效性為Session范圍的ActionForm中的方式。采用List類型變量存儲購物信息Shoplist,購物車Cart中存放的是每件商品的條目信息,而每件商品的信息在相應(yīng)的商品文件ProductItemDetail中。
(2) 訂單的設(shè)計。訂單是商務(wù)活動中的一個實體,是永久性、持續(xù)性對象,該系統(tǒng)訂單通過訂單表直接創(chuàng)建,由用戶提交后,直接寫入后臺數(shù)據(jù)庫,此時標(biāo)識訂單狀態(tài)為Unverified,然后由管理員處理訂單。檢查客戶賬戶余額,用戶檢驗通過后,發(fā)送確認Email,表示訂單已成功,最后改變訂單狀態(tài)為Submited。該系統(tǒng)主要分為兩個部分:前臺客戶應(yīng)用系統(tǒng);后臺數(shù)據(jù)處理系統(tǒng)。
3.1 系統(tǒng)業(yè)務(wù)流程及總體結(jié)構(gòu)
相對應(yīng)于功能模塊,系統(tǒng)主要分兩部分業(yè)務(wù):系統(tǒng)應(yīng)用和后臺管理。系統(tǒng)總體結(jié)構(gòu)圖如圖4所示。
說明:該系統(tǒng)共分為5個部分,首先是客戶端瀏覽部分,然后是Struts負責(zé)請表轉(zhuǎn)發(fā)和調(diào)Spring業(yè)務(wù)處理邏輯,之后是業(yè)務(wù)邏輯層,有一個業(yè)務(wù)邏輯的接口和一個數(shù)據(jù)庫操作接口,主要是實現(xiàn)業(yè)務(wù)邏輯,再次是Hhibernate層,主要是利用hibernate實現(xiàn)具體的數(shù)據(jù)庫操作,最后就是數(shù)據(jù)庫管理系統(tǒng)。
3.2 系統(tǒng)實現(xiàn)的部分代碼及最終結(jié)果
(1) Struts核心配置文件struts-config.xml
<form-beans>//Actionform Beans的配置
…</form-beans>
</action>…//設(shè)置action類
<action path="/login" //使用此Action的路徑是/login.do
…
<controller />//對于template插件的設(shè)置
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config"
…
(2) Hibernate配置文件hibernate.cfg.xml
說明:對于Hibernate的配置文件主要是對JDBC進行數(shù)據(jù)庫連接的一些基本配置
<property name="connection.username">root</property>//數(shù)據(jù)庫登錄名
<property name="connection.url">//數(shù)據(jù)庫連接地址
<property name="myeclipse.connection.profile">
shoppstore</property>//數(shù)據(jù)庫名
com.mysql.jdbc.Driver</property>//數(shù)據(jù)庫的jdbc驅(qū)動
<mapping resource="jsp/shopstore/hibernate/hibernate.cfg.xml" /><mapping
resource="jsp/shopstore/hibernate/front/Userinfo.hbm.xml" />//設(shè)置對應(yīng)數(shù)據(jù)庫表的xml文件路徑
…
(3) Spring配置文件bean.xml
<beans><!設(shè)置數(shù)據(jù)源對象-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
<value> jdbc:mysql://localhost:3306/shopstore</value>
…<!--配置sessionFactory-->
<bean id="sessionFactory" class="">……<bean>
<!--配置事務(wù)管理器--><bean id="transactionManager"…
</beans>
(4) 購物車部分實現(xiàn)代碼
HttpSession session=request.getSession();//取得用戶session
List li=(List) session.getAttribute("shopcat");//取得用戶已選商品信息
if(li==null){ li=new ArrayList();}
String id=shop_cartForm.getId1();
IBL ibl=new IBLImpl();
Object obj=ibl.productItemDetail(id);
…
return mapping.findForward("suc");//返回到成功跳轉(zhuǎn)頁面
…
系統(tǒng)實現(xiàn)的最終形式如圖5所示。
4 結(jié) 語
在項目開發(fā)中選擇Struts,Hibernate和Spring來搭建J2EE架構(gòu)。由于層次之間松散耦合和各層內(nèi)部的高內(nèi)聚,在開發(fā)過程中,層與層之間的工作幾乎是完全獨立的。三者的結(jié)合體現(xiàn)了良好的設(shè)計思想:Struts和Spring是基于MVC的框架,兩者的結(jié)合很好地分離業(yè)務(wù)邏輯和表示層;Hibernate是一個小巧的實現(xiàn)對象關(guān)系映射的工具,把面向?qū)ο蟮脑O(shè)計開發(fā)與關(guān)系數(shù)據(jù)庫聯(lián)系起來。
基于這三種框架的架構(gòu)也并非沒有缺點,如:Struts中Action的映射非常復(fù)雜;Hibernate的對象、關(guān)系之間的映射工作量很大;兩者的配置文件都很復(fù)雜等等。其實,這正是其靈活之處。因為把各層都完全分離了所以才易于重用和可擴展,因而其靈活映射的配置文件才會很復(fù)雜。
參考文獻
[1]黃煙波,張紅宇,李建華.基于Struts和Hibernate的J2EE架構(gòu)[J].計算機時代,2004(10):29-30.
[2]宋漢增,沈琳.利用Hibernate對象持久化服務(wù)簡化Java數(shù)據(jù)庫訪問[J].計算機應(yīng)用,2003(12):135-137.
[3]計磊,李里,周偉.J2EE-Eclipse struts Hibernate Spring整合應(yīng)用案例[M].北京:人民郵電出版社,2006.
[4]黃海,朱躍龍.J2EE設(shè)計模式與框架技術(shù)的應(yīng)用研究[J].計算機與現(xiàn)代化,2006(5):114-115.
[5]趙小穗,李建民,林振榮.基于Hibernate和Struts的Web應(yīng)用系統(tǒng)的設(shè)計[J].計算機與現(xiàn)代化,2007(6):76-80.
[6]Cay S Horstmann.Gary Cornell Java 2核心技術(shù) (卷I):基礎(chǔ)知識[M].北京:機械工業(yè)出版社,2006.
[7]Bruce Eckel.Java編程思想[M].北京:機械工業(yè)出版社,2005.
[8]Arnold Doray.Struts基礎(chǔ)教程[M].北京:人民郵電出版社,2007.
[9]戎偉,張雙.Struts-Java流行服務(wù)器、框架、工具及整合應(yīng)用[M].北京:人民郵電出版社,2006.
[10]邵麗萍,紹光亞,張后揚.Java語言程序設(shè)計[M].北京:清華大學(xué)出版社,2005.
作者簡介
趙 洋 男,1974年出生,遼寧撫順人,講師,碩士。主要從事計算機軟件的研究工作。
張 麗 女,1979年出生,教師,碩士,助教。主要從事計算機軟件的研究工作。
王恩東 男,1978年出生,教師,碩士,助教。主要從事計算機軟件的研究工作。
張素寧 女,1984年出生,河北衡水人,在讀碩士研究生。主要從事計算機軟件的研究工作。