摘 要:針對當(dāng)前Web應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序開發(fā)面臨的問題,結(jié)合目前比較流行的開源" title="開源">開源框架Spring、Struts和Hibernate,提出了一種開發(fā)J2EE Web應(yīng)用的輕量級解決方案,以幫助開發(fā)人員在短期內(nèi)搭建結(jié)構(gòu)清晰、可復(fù)用性好、維護(hù)方便的Web應(yīng)用程序。并且,通過案例具體說明了如何將這一方案應(yīng)用到實際項目中。
關(guān)鍵詞:J2EE? MVC? Struts? Spring? Hibernate
?
??? 大型企業(yè)級Web應(yīng)用系統(tǒng)的開發(fā)通常要求有一個良好的軟件架構(gòu)、便于協(xié)作開發(fā)和擴(kuò)展升級,而傳統(tǒng)的開發(fā)模式不能很好地滿足這些要求。本文針對當(dāng)前Web應(yīng)用程序開發(fā)面臨的問題,結(jié)合目前比較流行的開源框架SSH(Spring、Struts、Hibernate),提出一種開發(fā)J2EE 企業(yè)級Web應(yīng)用的輕量級解決方案,并通過案例具體說明如何將這一方案應(yīng)用到實際項目中。
1 框架技術(shù)
??? 著名的軟件大師Ralph Johnson對框架(Framework)進(jìn)行了如下的定義: 框架是整個系統(tǒng)或系統(tǒng)的一部分的可重用設(shè)計,由一組抽象的類及其實例間的相互作用方式組成[1]。
??? 框架一般具有即插即用的可重用性、成熟的穩(wěn)定性以及良好的團(tuán)隊協(xié)作性。J2EE復(fù)雜的多層結(jié)構(gòu)決定了大型的J2EE項目需要運(yùn)用框架和設(shè)計模式來控制軟件質(zhì)量。目前,市場上出現(xiàn)了一些商業(yè)的、開源的基于J2EE的應(yīng)用框架,其中主流的框架技術(shù)有:基于MVC模式的Struts框架和基于IoC模式的Spring框架以及對象/關(guān)系映射框架Hibernate等。
1.1? 表示層框架Struts
???? Struts是一個在JSP Model2基礎(chǔ)上實現(xiàn)的MVC框架,主要分為模型(Model)、視圖(Viewer)和控制器(Controller)三部分,其主要的設(shè)計理念是通過控制器將表現(xiàn)邏輯和業(yè)務(wù)邏輯解耦,以提高系統(tǒng)的可維護(hù)性、可擴(kuò)展性和可重用性[2]。Struts框架的體系結(jié)構(gòu)如圖1所示。
?
下面就圖1所示的體系結(jié)構(gòu)圖分析Struts框架中的MVC組件。
??? (1)視圖:視圖部分主要由JSP頁面組成,其中沒有流程邏輯、業(yè)務(wù)邏輯和模型信息,只有標(biāo)記。Struts自身包含了一組標(biāo)記庫(TagLib),這也是Struts的精華之一,靈活運(yùn)用它們可以簡化JSP頁面的代碼,提高開發(fā)效率" title="開發(fā)效率">開發(fā)效率。
??? (2)控制器:Struts中的Controller主要是其自身提供的ActionServlet。ActionServlet接收所有來自客戶端的請求并根據(jù)配置文件(struts-config.xml)中的定義將控制轉(zhuǎn)移到適當(dāng)?shù)腁ction對象。
??? (3)模型:Struts沒有定義具體Model層的實現(xiàn),Model層通常是和業(yè)務(wù)邏輯緊密相關(guān)的,有持續(xù)化的要求。目前在商業(yè)領(lǐng)域和開源世界,都有一些優(yōu)秀的工具可以為Model層的開發(fā)提供便利。
1.2? 業(yè)務(wù)邏輯層框架Spring
????Spring是一個解決了許多J2EE開發(fā)中常見問題并能夠替代EJB技術(shù)的強(qiáng)大的輕量級框架。這里所說的輕量級指的是Spring框架本身,而不是指Spring只能用于輕量級的應(yīng)用開發(fā)。Spring的輕盈體現(xiàn)在其框架本身的基礎(chǔ)結(jié)構(gòu)以及對其他應(yīng)用工具的支持和裝配能力。與EJB這種龐然大物相比,Spring可使程序研發(fā)人員把各個技術(shù)層次之間的風(fēng)險降低。
????Spring框架的核心是控制翻轉(zhuǎn)IoC(Inversion of Control)/依賴注入DI(Dependence Injection)機(jī)制。IoC是指由容器中控制組件之間的關(guān)系(這里,容器是指為組件提供特定服務(wù)和技術(shù)支持的一個標(biāo)準(zhǔn)化的運(yùn)行時的環(huán)境)而非傳統(tǒng)實現(xiàn)中由程序代碼直接操控,這種將控制權(quán)由程序代碼到外部容器的轉(zhuǎn)移,稱為“翻轉(zhuǎn)”[3]。DI是對IoC更形象的解釋,即由容器在運(yùn)行期間動態(tài)地將依賴關(guān)系(如構(gòu)造參數(shù)、構(gòu)造對象或接口)注入到組件之中[3]。Spring采用設(shè)值注入(使用Setter方法實現(xiàn)依賴)和構(gòu)造子注入(在構(gòu)造方法中實現(xiàn)依賴)的機(jī)制,通過配置文件管理組建的協(xié)作對象,創(chuàng)建可以構(gòu)造組件的IoC容器。這樣,不需要編寫工廠模式、單例模式或者其他構(gòu)造的方法,就可以通過容器直接獲取所需的業(yè)務(wù)組件。Spring框架的結(jié)構(gòu)如圖2所示。
?
?Spring框架由七個定義明確的模塊組成,且每個模塊或組件都可以單獨(dú)存在,或者與其他一個或多個模塊聯(lián)合實現(xiàn)。Spring Core Container是一個用來管理業(yè)務(wù)組件的IoC容器,是Spring應(yīng)用的核心;Spring DAO和Spring ORM不僅提供數(shù)據(jù)訪問" title="數(shù)據(jù)訪問">數(shù)據(jù)訪問的抽象模塊,還集成了對Hibernate、JDO和iBatis等流行的對象關(guān)系映射框架的支持模塊,并且提供了緩沖連接池、事務(wù)處理等重要的服務(wù)功能,保證了系統(tǒng)的性能和數(shù)據(jù)的完整性;Sprnig Web模塊提供了Web應(yīng)用的一些抽象封裝,可以將Struts、Webwork等Web框架與Spring整合成為適用于自己的解決方案。
??? Spring框架可以成為企業(yè)級應(yīng)用程序一站式的解決方案,同時它也是模塊化的框架,允許開發(fā)人員自由地挑選適合自己應(yīng)用的模塊進(jìn)行開發(fā)。Spring框架式是一個松耦合的框架,框架的部分耦合度被設(shè)計為最小,在各個層次上具體選用哪個框架取決于開發(fā)者的需要。
1.3 數(shù)據(jù)持久層框架Hibernate
??? O/R mapping技術(shù)是為了解決關(guān)系型數(shù)據(jù)庫和面向?qū)ο蟮某绦蛟O(shè)計之間不匹配的矛盾而產(chǎn)生的。Hibernate是目前最為流行的O/R mapping框架,它在關(guān)系型數(shù)據(jù)庫和Java對象之間做了一個自動映射,使得程序員可以以非常簡單的方式實現(xiàn)對數(shù)據(jù)庫的操作。Hibernate工作原理如圖3所示。
?
?Hibernate通過對JDBC的封裝,向程序員屏蔽了底層的數(shù)據(jù)庫操作,使程序員專注于OO程序的開發(fā),有助于提高開發(fā)效率。程序員訪問數(shù)據(jù)庫所需要做的就是為持久化對象編制xml映射文件[4]。
????底層數(shù)據(jù)庫的改變只需要簡單地更改初始化配置文件(hibernate.cfg.xml或者h(yuǎn)ibernate.properties)即可,不會對應(yīng)用程序產(chǎn)生影響。
???? Hibernate有自己的面向?qū)ο蟮牟樵冋Z言HQL,HQL功能強(qiáng)大,支持目前大部分主流的數(shù)據(jù)庫,如Oracle、DB2、MySQL、Microsoft SQL Server等,是目前應(yīng)用最廣泛的O/R映射工具。Hibernate為快速開發(fā)應(yīng)用程序提供了底層的支持。
2 基于SSH組合框架的Web應(yīng)用模型設(shè)計與實現(xiàn)
2.1 集成SSH的新型J2EE框架
前面分析了基于J2EE的三種框架技術(shù),下面通過集成以上三種框架技術(shù)來對傳統(tǒng)的J2EE Web開發(fā)模型加以改進(jìn),以形成一種新的、輕量型的J2EE架構(gòu)。
集成SSH框架的系統(tǒng)框架圖如圖4所示,系統(tǒng)從職責(zé)上分為四層:表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層和域模塊層。其中使用Struts作為系統(tǒng)的整體基礎(chǔ)架構(gòu),負(fù)責(zé)MVC的分離,在Struts框架的模型部分,利用Hibernate框架對持久層提供支持,業(yè)務(wù)層用Spring支持。具體做法是:用面向?qū)ο蟮姆治龇椒ǜ鶕?jù)需求提出一些模型,將這些模型實現(xiàn)為基本的Java對象,然后編寫基本的DAO接口,并給出Hibernate的DAO實現(xiàn),采用Hibernate架構(gòu)實現(xiàn)的DAO類來實現(xiàn)Java類與數(shù)據(jù)庫之間的轉(zhuǎn)換和訪問,最后由Spring完成業(yè)務(wù)邏輯。
?
系統(tǒng)的基本業(yè)務(wù)流程是: 在表示層中,首先通過JSP頁面實現(xiàn)交互界面,負(fù)責(zé)傳送請求(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é)作對象數(shù)據(jù)處理(DAO)組件完成業(yè)務(wù)邏輯,并提供事務(wù)處理、緩沖池等容器組件以提升系統(tǒng)性能和保證數(shù)據(jù)的完整性。而在持久層中,則依賴于Hibernate的對象化映射和數(shù)據(jù)庫交互,處理DAO組件請求的數(shù)據(jù),并返回處理結(jié)果。
采用上述開發(fā)模型,不僅實現(xiàn)了視圖、控制器與模型的徹底分離,而且還實現(xiàn)了業(yè)務(wù)邏輯層與持久層的分離。這樣無論前端如何變化,模型層只需很少的改動,并且數(shù)據(jù)庫的變化也不會對前端有所影響,大大提高了系統(tǒng)的可復(fù)用性。而且由于不同層之間耦合度小,有利于團(tuán)隊成員并行工作,大大提高了開發(fā)效率。
2.2 基于SSH框架的Web應(yīng)用系統(tǒng)的實現(xiàn)
下面將通過一個實際的系統(tǒng)來展示如何進(jìn)行基于SSH框架的Web應(yīng)用開發(fā)。該系統(tǒng)是為某通信公司運(yùn)營部開發(fā)的一個問答式系統(tǒng),功能類似于百度知道和新浪愛問。由于系統(tǒng)的模塊較多,下面就以一個用戶管理模塊為例來說明系統(tǒng)的開發(fā)實現(xiàn)過程,并將按照數(shù)據(jù)持久層、業(yè)務(wù)邏輯層、表示層的順序說明系統(tǒng)構(gòu)建過程。
?。?)數(shù)據(jù)持久層
數(shù)據(jù)持久層由Java對象持久化類和數(shù)據(jù)訪問對象(DAO)組成。每個數(shù)據(jù)庫表都對應(yīng)著一個持久化對象,這樣就給予了開發(fā)者使用OO思想設(shè)計和開發(fā)的便利,同時也屏蔽了具體的數(shù)據(jù)庫和具體的數(shù)據(jù)表、字段,消除了對數(shù)據(jù)庫操作的硬編碼在重用性上的弊端。用戶信息表的部分結(jié)構(gòu)如表1所示。
?
Hibernate通過映射(Mapping)文件將對象(Object)與關(guān)系型數(shù)據(jù)(Relational)相關(guān)聯(lián),因此需要編寫和數(shù)據(jù)庫表相對應(yīng)的Java持久化類以及對應(yīng)的映射文件。有了Java持久化類后就可以在此基礎(chǔ)上實現(xiàn)數(shù)據(jù)訪問類。在Spring框架中,數(shù)據(jù)訪問類可以從輔助類HibernateDaoSupport繼承,這極大地方便了Hibernate框架在Spring中的使用,相應(yīng)的部分代碼如下:
???? ?public class UserDao?
????????? extends HibernateDaoSupport {
??????public int add(User user) {
???? ???return Integer.ParseInt(this.getHibernateTemplate().save(user).toString());
??????}
??????public List findAll() {
???? ???return this.getHibernateTemplate().loadAll(User.class);
??????}
???? ?}
?具體的Hibernate數(shù)據(jù)源、session工廠、事務(wù)管理、緩沖連接池等功能都由業(yè)務(wù)層的Spring容器提供。
?。?)業(yè)務(wù)邏輯層
業(yè)務(wù)邏輯層由Spring框架支持,提供了處理業(yè)務(wù)邏輯的服務(wù)組件。開發(fā)者需要對業(yè)務(wù)對象建模,抽象出業(yè)務(wù)模型并封裝在Model組件中。由于數(shù)據(jù)持久層實現(xiàn)了Java持久化類并且封裝了數(shù)據(jù)訪問對象(DAO),因此可以在Model組件中方便地調(diào)用DAO組件來存取數(shù)據(jù)。Spring的IoC容器負(fù)責(zé)統(tǒng)一管理Model組件和DAO組件以及Spring所提供的事務(wù)處理、緩沖連接池等服務(wù)組件。
在用戶管理模塊中,通過業(yè)務(wù)建模創(chuàng)建了用戶模型UserService類,封裝了對用戶的權(quán)限管理以及積分管理等功能。UserService類通過調(diào)用數(shù)據(jù)訪問類UserDao實現(xiàn)對用戶數(shù)據(jù)的操作。這些組件的關(guān)系將通過配置Spring框架的applicationContext.xml聯(lián)系起來,配置文件的主要內(nèi)容如下:
??????
???? ?
???? (3)表示層
???? 表示層結(jié)合JSP和Struts的TagLib庫處理顯示功能,利用ActionServlet將請求(*.do)映射到相應(yīng)的Action,并由Action調(diào)用業(yè)務(wù)邏輯的服務(wù)組件,然后根據(jù)處理結(jié)果跳轉(zhuǎn)到Forword對象指定的響應(yīng)頁面。
???? 業(yè)務(wù)流程的部署由struts-config.xml完成。下面以一個顯示所有用戶信息的請求(ListUser.do)為例來說明配置文件的使用。
??????
????? 
??????
??????
???
??? 基于J2EE的Web應(yīng)用以其層次性、平臺無關(guān)性的優(yōu)勢已經(jīng)逐漸成為了電子商務(wù)、電子政務(wù)主要的解決方案。本文針對傳統(tǒng)的J2EE Web應(yīng)用開發(fā)的弊端,提出了一種利用輕量級框架來快速搭建Web應(yīng)用的解決方案,并且通過其在實際項目中的應(yīng)用,證明了采用此方案可以幫助開發(fā)人員在短時間內(nèi)建立結(jié)構(gòu)清晰、可重用性好、維護(hù)擴(kuò)展方便的Web應(yīng)用程序。
參考文獻(xiàn)
[1] ?GAMMA E, HELM R, JOHNSON R, et al. Design patterns:Elements of reusable object-oriented software[M]. Addison ?Wesley, 1994.
[2] ?孫衛(wèi)琴.精通Struts:基于MVC的Java Web設(shè)計與開發(fā)[M]. 北京:電子工業(yè)" title="電子工業(yè)">電子工業(yè)出版社,2004.
[3] ?JOHNSON R, HOELLER J, ARENDSEN A, et al. Java/J2EE application framework reference document. V1.1.
?2004.
[4] ?徐長盛,戴超.一種快速開發(fā)Web應(yīng)用程序方法的研究[J]. 計算機(jī)工程與設(shè)計,2004,(12):2237-2239.
[5] ?夏昕,曹曉鋼,唐勇.深入淺出Hibernate[M]. 北京:電子工業(yè)出版社,2005.
[6] ?JOHNSON R.Expert one-on-one J2EE design and development[M]. 魏海萍譯.北京:電子工業(yè)出版社,2003.





