摘要:在設(shè)計(jì)模式MVC思想的基礎(chǔ)之上,該文提出了基于WebWork、Spring和Hibernate的J2EE輕量級(jí)集成框架的應(yīng)用。首先簡(jiǎn)要的介紹了這三種開(kāi)源軟件的基礎(chǔ)技術(shù),然后給出了整個(gè)集成框架的原理,最后分析了在Web項(xiàng)目中集成框架的應(yīng)用,并說(shuō)明了集成框架在代碼復(fù)用和開(kāi)發(fā)效率上的優(yōu)勢(shì)。
關(guān)鍵詞:MVC;框架;WebWork;Spring;Hibernate;代碼復(fù)用
中圖分類(lèi)號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)14-3704-02
The Research and Application based on J2EE Integrated Open-source Framework
CHEN Cheng
(Xingzhi Academy, NanJing Xiaozhuang College, Nanjing 210012, China)
Abstract: Based on the popular design patterns MVC, it has proposed the lightweight J2EE integrated framework based on WebWork, Spring and Hibernate, firstly has introduced the foundation of the three open-sources software, then has presented the principle of the integrated structure, lastly has analyzed the applications in the Web project based on the integrated framework, as well as has show the advantages of the integrated framework in the code reuse and the development efficiency.
Key words: MVC; framework; WebWork; Spring; Hibernate; the code reuse
1 引言
隨著信息技術(shù)的發(fā)展和B/S應(yīng)用程序的廣泛使用,為能簡(jiǎn)單高效地開(kāi)發(fā)Web項(xiàng)目,迫切需要一個(gè)通用、穩(wěn)定的集成架構(gòu),來(lái)提高工作效率、增強(qiáng)程序的可維護(hù)性和可擴(kuò)展性。本文選擇開(kāi)源框架WebWork、Spring和Hibernate相結(jié)合的應(yīng)用,實(shí)現(xiàn)了一套方便靈活、低耦合、易維護(hù)的開(kāi)發(fā)方式。
2 J2EE開(kāi)源框架
2.1 MVC模式
傳統(tǒng)的Web項(xiàng)目開(kāi)發(fā),存在諸多不足,MVC模式(Model View Controller, MVC)的出現(xiàn)使其得到了改進(jìn)和完善。在MVC模式中Event(事件)導(dǎo)致Controller改變Model或View,或者同時(shí)改變兩者。只要Controller改變了Model的數(shù)據(jù)或者屬性,所有依賴(lài)的View都會(huì)自動(dòng)更新。只要Controller改變了View的部分,View會(huì)潛在的從Model中獲取數(shù)據(jù)來(lái)刷新自己?;贛VC應(yīng)用程序的開(kāi)發(fā)總是由這三個(gè)部分共同協(xié)作來(lái)完成。MVC組件的關(guān)系和功能如圖1所示。
MVC設(shè)計(jì)模式是利用控制器來(lái)分離模型和視圖,從而達(dá)到一種層間松散耦合的效果,減弱業(yè)務(wù)邏輯接口和數(shù)據(jù)接口之間的耦合性,提高了系統(tǒng)的靈活性、可復(fù)用性和可維護(hù)性?,F(xiàn)在網(wǎng)絡(luò)開(kāi)發(fā)框架多數(shù)都遵循MVC設(shè)計(jì)模式,效果較好。
2.2 WebWork框架
WebWork是基于Command設(shè)計(jì)模式的,致力于組件化和代碼重用的強(qiáng)大的開(kāi)源框架[2]。在利用WebWork框架開(kāi)發(fā)的過(guò)程中,根據(jù)業(yè)務(wù)邏輯創(chuàng)建的實(shí)現(xiàn)方法xAtion擔(dān)任控制器的角色,它實(shí)現(xiàn)了WebWork類(lèi)庫(kù)中XWork中的Action接口。其主要功能是從請(qǐng)求中獲取前臺(tái)頁(yè)面需要傳送的參數(shù)值,把這些值傳遞給執(zhí)行業(yè)務(wù)邏輯操作的模型對(duì)象,由業(yè)務(wù)對(duì)象執(zhí)行業(yè)務(wù)邏輯操作,并返回給轉(zhuǎn)向頁(yè)面用來(lái)顯示執(zhí)行的結(jié)果。
MVC中的表現(xiàn)層負(fù)責(zé)頁(yè)面的顯示和業(yè)務(wù)邏輯的處理,利用WebWork的標(biāo)簽庫(kù)與JavaScript腳本語(yǔ)言相結(jié)合的方式實(shí)現(xiàn)。WebWork框架從Web中脫離出來(lái),與框架Struts相比,在Action類(lèi)的抽象和Web環(huán)境的耦合方面具有優(yōu)勢(shì),在開(kāi)發(fā)過(guò)程中更加方便和實(shí)用。
2.3 Spring框架
Spring框架是一個(gè)分層的J2EE應(yīng)用程序框架,它是一個(gè)從實(shí)際項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn)中抽取出來(lái)的,可高度重用的開(kāi)發(fā)框架[1]。Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式。Spring通過(guò)接口松藕合的JavaBean模型提供了基于IoC 容器的BeanFactory和基于AOP (面向方面編程)框架的JavaBean組件,不需要在程序中維護(hù)組件之間的依賴(lài)關(guān)系,只要在配置文件applicationContext.xml中設(shè)置屬性,Spring容器將自動(dòng)依賴(lài)注入到相關(guān)的組件,完成業(yè)務(wù)方法層組件的配置與加載。使Web應(yīng)用開(kāi)發(fā)過(guò)程中,能實(shí)現(xiàn)邏輯層和數(shù)據(jù)訪(fǎng)問(wèn)層的完全分離。Spring框架與持久層框架Hibernate集成到一起,從而實(shí)現(xiàn)支持DAO以及事務(wù)策略,提高代碼的可重用性。
2.4 Hibernate框架
Hibernate是一種實(shí)現(xiàn)對(duì)象和關(guān)系映射的框架,它對(duì)JDBC進(jìn)行了輕量級(jí)的對(duì)象封裝,使程序員能使用面向?qū)ο蟮乃枷雭?lái)操作關(guān)系數(shù)據(jù)庫(kù),Hibernate的目標(biāo)是減輕開(kāi)發(fā)者與大量普通數(shù)據(jù)持續(xù)性相聯(lián)系的一些編程任務(wù),在開(kāi)發(fā)進(jìn)程中,能自動(dòng)生成SQL,使開(kāi)發(fā)者擺脫了手工處理結(jié)果集和進(jìn)行對(duì)象轉(zhuǎn)化的繁瑣任務(wù),并能使應(yīng)用程序移植到所有的SQL數(shù)據(jù)庫(kù),提供透明的持續(xù)性。在使用Hibernate框架時(shí),通過(guò)編寫(xiě)O/R映射描述文件,完成對(duì)象、關(guān)系數(shù)據(jù)庫(kù)之間的映射,持久對(duì)象則根據(jù)映射文件生成,最后,編寫(xiě)業(yè)務(wù)邏輯類(lèi)[7]。在實(shí)際開(kāi)發(fā)中,以上工作不需要程序員編寫(xiě),利用MyEclipse自帶的Hibernate框架,通過(guò)配置和數(shù)據(jù)庫(kù)之間的連接,即可導(dǎo)出所需要的JavaBean類(lèi)。JavaBean類(lèi)實(shí)現(xiàn)具體的業(yè)務(wù)邏輯,也封裝了對(duì)Hibernate的訪(fǎng)問(wèn),為應(yīng)用程序提供數(shù)據(jù)持久服務(wù)。
3 集成框架原理
整個(gè)J2EE輕量級(jí)Web集成開(kāi)發(fā)架構(gòu)選用WebWork、Spring和Hibernate 3種框架技術(shù),實(shí)現(xiàn)集成架構(gòu)。客戶(hù)端層采用JSP表示,用WebWork自帶的標(biāo)簽庫(kù)和JavaScript實(shí)現(xiàn)客戶(hù)端的顯示和控制,并做相應(yīng)的請(qǐng)求和響應(yīng);表示層用WebWork統(tǒng)一管理視圖和控制器部分,利用WebWork的ServletDispatcher作為控制器,接受客戶(hù)端的HTTP請(qǐng)求,創(chuàng)建并調(diào)用對(duì)應(yīng)的Action實(shí)現(xiàn)類(lèi),完成與業(yè)務(wù)邏輯層的交互,并返回執(zhí)行結(jié)果到客戶(hù)端層;業(yè)務(wù)邏輯層是利用接口與實(shí)現(xiàn)相分離的方式編寫(xiě)對(duì)應(yīng)的Service對(duì)象,在Spring的IoC容器中登記為業(yè)務(wù)模型,由Spring負(fù)責(zé)管理和配置DAO組件,提供給對(duì)應(yīng)的Action完成業(yè)務(wù)邏輯,同時(shí)提供事務(wù)處理、緩沖池等容器組件來(lái)提升系統(tǒng)的性能,保證數(shù)據(jù)完整性;數(shù)據(jù)持久層采用Hibernate框架,使用導(dǎo)入DAO的方式完成最終的Java類(lèi)和數(shù)據(jù)庫(kù)之間的轉(zhuǎn)換和訪(fǎng)問(wèn);數(shù)據(jù)層采用關(guān)系數(shù)據(jù)管理系統(tǒng),如Oracle,MySQL等。整個(gè)集成開(kāi)發(fā)架構(gòu)如圖2所示。
采用上述方式,利用WebWork、Spring和 Hibernate框架各自的優(yōu)勢(shì),能有效實(shí)現(xiàn)視圖、控制器與模型的分離,將業(yè)務(wù)邏輯層和數(shù)據(jù)持久層獨(dú)立出來(lái)。其中,框架WebWork在Web程序開(kāi)發(fā)中起到重要作用。
4 集成框架的應(yīng)用
開(kāi)發(fā)中,有很多Web項(xiàng)目使用J2EE的開(kāi)源框架,本文重點(diǎn)介紹一下利用開(kāi)源框架WebWork、Spring和Hibernate相結(jié)合的方式來(lái)開(kāi)發(fā)Web項(xiàng)目。 選擇MyEclipse作為Java的開(kāi)發(fā)平臺(tái),其可以直接加載項(xiàng)目所需要的開(kāi)源框架WebWork、Spring和Hibernate的相關(guān)的類(lèi)以及配置文件。
4.1 加載開(kāi)源框架類(lèi)
在Web項(xiàng)目中,首先導(dǎo)入Spring開(kāi)源框架,建立SessionFactory對(duì)應(yīng)的類(lèi),MyEclipse開(kāi)發(fā)平臺(tái)將加載Spring運(yùn)行的相關(guān)類(lèi)和applicationContext.xml配置文件,然后在Spring的基礎(chǔ)之上加載Hibernate,根據(jù)關(guān)系型數(shù)據(jù)庫(kù)所建立的表,在MyEclipse中的配置打開(kāi)數(shù)據(jù)庫(kù)連接,導(dǎo)入數(shù)據(jù)表的對(duì)象類(lèi)和一些基本的數(shù)據(jù)操作的實(shí)現(xiàn)方法。另外還需要把WebWork相關(guān)的類(lèi)復(fù)制到項(xiàng)目中,添加X(jué)Work.xml文件,并且在web.xml文件中配置我們所用的WebWork框架,使其加載類(lèi)在項(xiàng)目中能夠正常的使用。
4.2 登陸模塊的應(yīng)用
在實(shí)際Web項(xiàng)目中,這三種框架相結(jié)合使用的事例較多,用法基本相同,只是功能有所差別。以用戶(hù)登陸模塊為例做一介紹,如:前臺(tái)JSP頁(yè)面功能,其主要實(shí)現(xiàn)代碼如下:
用戶(hù)名:
密碼:
4.3 XWork.xml的配置
從JSP頁(yè)面上將用戶(hù)輸入的用戶(hù)名和密碼提交后,將轉(zhuǎn)入配置文件XWork.xml中,通過(guò)這個(gè)配置文件尋找Java后臺(tái)處理登陸過(guò)程邏輯的類(lèi),同時(shí)將提交的內(nèi)容轉(zhuǎn)移到Java邏輯類(lèi)中進(jìn)行判斷處理。登陸模塊配置的主要代碼如下:
4.4 邏輯處理
如上XWrok.xml中的配置相對(duì)應(yīng),在LoginAction這個(gè)類(lèi)中,使用UserLogin的邏輯處理方法,用于判斷用戶(hù)名和密碼是否和數(shù)據(jù)庫(kù)中的數(shù)據(jù)相符,以此做出不同的處理,并返回給頁(yè)面顯。UserLogin方法實(shí)現(xiàn)主要代碼如下:
public String Userlogin(){
int flag = lb.CheckLogin(username, password); //判斷是否合法
……
User user = lb.getLoginUser (username);
session. setAttribute (\"user\", user);
return Action.SUCCESS;
}
另外,在數(shù)據(jù)庫(kù)的導(dǎo)入過(guò)程中,根據(jù)數(shù)據(jù)庫(kù)中表的名稱(chēng),采用Hibernate框架可以將對(duì)象類(lèi)User.java和操作類(lèi)UserDAO.java這兩個(gè)類(lèi)導(dǎo)入到項(xiàng)目中,在處理邏輯的過(guò)程中可以直接調(diào)用,方便快捷,加速了項(xiàng)目開(kāi)發(fā)的周期。
4.5 前臺(tái)頁(yè)面響應(yīng)
在后臺(tái)根據(jù)用戶(hù)名和密碼做出判斷,在前臺(tái)顯示結(jié)果,主要表現(xiàn)為兩方面,一個(gè)是頁(yè)面的轉(zhuǎn)向,通過(guò)XWork.xml的配置得出要跳轉(zhuǎn)到哪個(gè)頁(yè)面。如上面程序所示,如果返回Action. ERROR,則轉(zhuǎn)向error.jsp;如果返回Action. SUCCESS,則轉(zhuǎn)向index.jsp。另一個(gè)是信息的反饋,通過(guò)Session或Request將需要傳送到前臺(tái)頁(yè)面的值放到緩沖區(qū)里,然后顯示在JSP頁(yè)面相應(yīng)的位置。
從上面這個(gè)登陸流程的簡(jiǎn)單的例子可以看出,在整個(gè)集成框架中不存在與業(yè)務(wù)邏輯無(wú)關(guān)的垃圾代碼,也沒(méi)有SQL查詢(xún)語(yǔ)句,整個(gè)開(kāi)發(fā)過(guò)程完全是面向?qū)ο蟮牟僮鞣绞胶涂蓜?dòng)態(tài)配置、可移植的Xml文件,大大提高了開(kāi)發(fā)效率。
5 總結(jié)
綜上所述,將 WebWork、Spring和Hibernate三種開(kāi)源框架集成在一起,形成一種輕量級(jí)Web開(kāi)發(fā)架構(gòu)。該架構(gòu)充分發(fā)揮了三者的優(yōu)點(diǎn),層次清晰,具有較高的伸縮性、可擴(kuò)展性和可復(fù)用性,開(kāi)發(fā)簡(jiǎn)潔、維護(hù)方便,在Web項(xiàng)目的設(shè)計(jì)和開(kāi)發(fā)中有一定的優(yōu)勢(shì)和廣泛的應(yīng)用前景。
參考文獻(xiàn):
[1] Raible M. Spring Live[M]. 2004,Source Beat Publishing.
[2] LightBody P,WebWork in Action[M]. Manning Publications Co.2005.
[3] 閻宏.Java與模式[M]. 北京:電子工業(yè)出版社,2005.
[4] Johnson R. J2EE設(shè)計(jì)開(kāi)發(fā)編程指南[M]. 北京:電子工業(yè)出版社,2003.
[5] 孫衛(wèi)琴. 精通對(duì)象持久化技術(shù)詳解[M]. 北京:電子工業(yè)出版社,2005.
[6] Eckel B. Java編程思想[M]. 侯捷,譯.北京:機(jī)械工業(yè)出版社,2002.
[7] 夏昕,曹曉鋼,唐勇. 深入淺出Hibernate[M]. 北京:電子工業(yè)出版社,2005.