摘 要:Spring是J2EE開發(fā)的一種輕量級框架,它是為簡化傳統(tǒng)J2EE的開發(fā)過程復(fù)雜性而創(chuàng)建的。通過分析Spring框架結(jié)構(gòu)及其特點和構(gòu)建一個多層體系結(jié)構(gòu)的電子政務(wù)系統(tǒng),展示了Spring框架技術(shù)在J2EE開發(fā)過程中的強(qiáng)大優(yōu)勢。實踐表明,使用Spring可以降低Web應(yīng)用開發(fā)的復(fù)雜性,提高開發(fā)效率和質(zhì)量。
關(guān)鍵詞:J2EE;電子政務(wù);Spring;iBatis;反轉(zhuǎn)控制
中圖分類號:TP311.5文獻(xiàn)標(biāo)識碼:B
文章編號:1004-373X(2008)24-079-04
Design and Realization of E-Government System Based on Spring
LIU Shuangyi,ZHU Li,LI Xiang
(School of Computer Science,China University of Geosciences,Wuhan,430074,China)
Abstract:Spring is a lightweight framework based on J2EE and created for simplifying the traditional development process of J2EE.Through analysing the Spring framework and its characters and building E-gorvernment system with multilayer architecture,it shows the good advantage of Spring framework in the J2EE development process.Practice proves that by using Spring,the complexity of Web application development can be reduced so that the efficiency and quality of the development is improved.
Keywords:J2EE;E-government;Spring;iBatis;inversion of control
1 引 言
J2EE(Java 2 Platform Enterprinse Edition)技術(shù)作為一種建立企業(yè)應(yīng)用的標(biāo)準(zhǔn)平臺出現(xiàn),得到極大的發(fā)展。J2EE 平臺使用了大量不同的技術(shù)標(biāo)準(zhǔn)如JSP,Java Servlet,EJB,JMS, JNDI等,而且還提供了多層分布式應(yīng)用模型、組件復(fù)用能力、統(tǒng)一的安全模型和靈活的事務(wù)處理,為開發(fā)和配置企業(yè)應(yīng)用提供健壯和穩(wěn)定的服務(wù)。
隨著網(wǎng)絡(luò)技術(shù)的不斷發(fā)展和成熟,J2EE的不足漸漸暴露出來,如EJB組件開發(fā)過于復(fù)雜、程序中充斥大量重復(fù)代碼、應(yīng)用程序不易測試等問題使得開發(fā)過程變得越來越困難。與此同時,越來越多的人們將目光轉(zhuǎn)向輕量級的框架。Spring作為一種主流輕量級框架,簡化了J2EE的開發(fā)過程,使得應(yīng)用程序具有高內(nèi)聚、低藕合、高彈性、易維護(hù)的優(yōu)點,更重要的是它可以使用JavaBean完成以前只有重量級組件EJB才有可能完成的工作。
J2EE的N層的體系結(jié)構(gòu)向開發(fā)者提供一種基于組件的設(shè)計和開發(fā)Web應(yīng)用的模塊化方法。應(yīng)用系統(tǒng)各層的實現(xiàn)技術(shù)多種多樣,每種技術(shù)都有其優(yōu)缺點和最適用的范圍。如何把這些技術(shù)組合起來形成一個適應(yīng)項目需要的穩(wěn)定架構(gòu)是項目開發(fā)過程中一個非常重要的問題。
2 關(guān)鍵技術(shù)介紹
2.1 Spring介紹
Spring是基于IoC(Inversion of Control,反向控制)和AOP的多層J2EE系統(tǒng)的框架[1]。Spring提供Bean的配置基礎(chǔ)、AOP的支持、JDBC的提取框架、抽象事務(wù)支持等。它實現(xiàn)了MVC,對不同的數(shù)據(jù)訪問技術(shù)提供了統(tǒng)一的接口,采用IoC可以很容易地實現(xiàn)Bean的裝配。
Spring由7個定義良好的模塊組成如圖1所示,分別為:核心模塊(Spring Core)、上下文模塊(Spring Context)、數(shù)據(jù)存取對象模塊(Spring DAO)、對象關(guān)系映射模塊(Spring ORM)、AOP支持模塊(Spring AOP)、MVC模塊(Spring MVC)和Web模塊(SpringWeb)。Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理Bean的方式。Spring是一個服務(wù)于所有層面的應(yīng)用程序框架。但它不強(qiáng)迫用戶必須在每一層中必須使用Spring,因為具有良好的模塊化性能,允許用戶根據(jù)自己的需要選擇使用它的某一個模塊。
2.2 Spring IoC容器
Spring的核心是IoC容器,也稱為DI(Dependancy Injection,注入依賴)容器,它很好地實現(xiàn)了IoC模式,幫助組件依賴關(guān)系的注入,同時消除程序模塊之間的耦合和代碼中依賴關(guān)系[2]。Spring的設(shè)計哲學(xué)是“提供一種無侵入式的高擴(kuò)展性框架”,因為基于侵入性框架設(shè)計開發(fā),會使得代碼與框架的緊耦合,任何脫離這個框架的設(shè)計都將導(dǎo)致整個系統(tǒng)的崩潰,這正是所需要避免的情況。Spring大量引入了Java的Reflection機(jī)制,通過動態(tài)調(diào)用的方式避免硬編碼方式的約束,并在此基礎(chǔ)上建立了其核心組件BeanFactory,以此作為其依賴注入機(jī)制的實現(xiàn)基礎(chǔ)。

在傳統(tǒng)的OOP的編程中經(jīng)??梢钥吹?,如果一個應(yīng)用代碼需要調(diào)用另一個類A,它就必須先告訴容器或框架找到這個類,然后再負(fù)責(zé)將其實例化,并調(diào)用。如果被調(diào)用的類A是接口A的實現(xiàn),它將直接負(fù)責(zé)實例化一個子類。如圖2所示,從這里可以看到有2個依賴關(guān)系存在:應(yīng)用代碼既依賴接口,也依賴具體實現(xiàn)。而在IoC模式中,這樣的“控制”被反轉(zhuǎn),從應(yīng)用代碼轉(zhuǎn)移到了框架或容器上,則創(chuàng)實例化對象的任務(wù)將由框架或容器來實現(xiàn),即在運(yùn)行期由容器將依賴關(guān)系注入到組件之中。
如圖3所示,這時應(yīng)用代碼只依賴接口。

Martin Fowler在[3]關(guān)于DI的文章中提出了3種方式實現(xiàn):接口注入(Interface Injection),構(gòu)造注入(Construction Injection)和設(shè)值注入(Setter Injection),并且分別命名為:type 1 IoC,type 2 IoC,type 3 IoC。只需在Spring的配置文件中做出具體聲明,就可完成依賴注入。注入依賴消除了對具體實現(xiàn)類的依賴,從而降低了組件之間的耦合度,提高程序的擴(kuò)展性且極大改善代碼的可重用性,真正做到“抽象不依賴于實現(xiàn),實現(xiàn)必須依賴于抽象”。
2.3 Spring MVC框架介紹
MVC是Model-View-Controller的簡稱,即模型-視圖-控制器。它是一種設(shè)計模式,強(qiáng)制性把應(yīng)用程序的輸入、處理和輸出分開。Spring Web框架對Model、View和Controller方面提供了清晰的劃分,實現(xiàn)了功能模塊和顯示模塊的分離。
SpringMVC的核心Dispatchservlet,負(fù)責(zé)把處理請求的責(zé)任委托給對應(yīng)的Controller,所以又稱為前置控制器(Front-controller)。它會根據(jù)處理器映射(Handler Mapping)來選擇并決定將請求發(fā)送給那一個控制器(Controller),控制器接受Request和Response參數(shù)并負(fù)責(zé)處理請求。不過,實際上,一個良好設(shè)計的控制器自身并不處理任何信息,而是將其委托給業(yè)務(wù)邏輯層處理。最后得到的原始數(shù)據(jù)(Model)數(shù)據(jù)和將要顯示數(shù)據(jù)的頁面(View),一起綁定到ModelAndVIew對象中,并返回給Dispatchservlet,再根據(jù)視圖解析器(ViewResovler)找到View的真實頁面并將Model數(shù)據(jù)交由View顯示。
3 系統(tǒng)構(gòu)架設(shè)計
J2EE的N層體系構(gòu)架簡化了企業(yè)應(yīng)用開發(fā)[4] 。它將系統(tǒng)分成表示層(Presentation Layer)、持久層(Persistence Layer)、業(yè)務(wù)層(Business Logic Layer)以及數(shù)據(jù)對象領(lǐng)域模型(Domin Object Model)。表示層使用MVC模式將其分為視圖層(View Layer)、控制器層(Controller Layer)和模型層(Model Layer)。每一應(yīng)用層在保持彼此獨(dú)立同時與相鄰的層間都以一種松耦合的方式彼此溝通,這樣可以專注本層設(shè)計,而不必?fù)?dān)心影響到其他層,從而解決了Web應(yīng)用系統(tǒng)開發(fā)過程中由于系統(tǒng)結(jié)構(gòu)復(fù)雜而帶來的一些問題。
在技術(shù)上,表示層采用SpringMVC框架、JSP(Java Server Page)和JSTL(JSP Standard Tag Library,JSP標(biāo)準(zhǔn)標(biāo)簽庫)來設(shè)計,業(yè)務(wù)邏輯層采用Spring框架設(shè)計相應(yīng)bean,持久層通過整合Spring框架與iBatis框架來實現(xiàn)。領(lǐng)域?qū)ο竽P蛯佑肞OJO來實現(xiàn)。整個系統(tǒng)技術(shù)構(gòu)架圖如圖4所示。
4 系統(tǒng)實現(xiàn)
4.1 領(lǐng)域模型層
領(lǐng)域模型層的作用是保存其他各層的數(shù)據(jù)和實現(xiàn)數(shù)據(jù)傳遞。對于其他層而言,一個域?qū)ο螅―omin Obect)相當(dāng)于數(shù)據(jù)庫表中的1條記錄。數(shù)據(jù)庫表與對應(yīng)的域?qū)ο箢愅ㄟ^配置文件實現(xiàn)他們之間關(guān)系的映射。域?qū)ο笫且粋€具有g(shù)etter和setter風(fēng)格的JavaBean,它可以將狀態(tài)和行為都進(jìn)行封裝。
持久層具體的DAO實現(xiàn)類將通來getter\\\\setter訪問對象的持久化數(shù)據(jù)。這里只需面對DominObject,數(shù)據(jù)庫對用戶來說是完全透明的。

4.2 持久層
Spring提供了對如iBatis,JDBC和ORM框架等數(shù)據(jù)訪問技術(shù)的支持,本文中使用iBatis框架實現(xiàn)。無論選擇那一種持久化機(jī)制,Spring都將很大程度地減少程序開發(fā)的復(fù)雜度。
持久層的實現(xiàn)也體現(xiàn)了IoC的設(shè)計思想,正如Spring所提倡的“注入接口編程而不是面向類編程”,實現(xiàn)上通過設(shè)計DAO接口類和DAOImpl,數(shù)據(jù)訪問方法暴露在DAO接口中,具體在DAOImpl中實現(xiàn)。因此要實現(xiàn)對數(shù)據(jù)庫的操作,必須在具體的類中調(diào)用具體的操作。
持久層主要定義應(yīng)用程序通過具體的類與數(shù)據(jù)庫交互。持久層的設(shè)計將定義系統(tǒng)中各個模塊的業(yè)務(wù)入口DAO接口,并定義它的實現(xiàn)類DAOImpl,如圖4所示。通過DAO接口得到具體業(yè)務(wù)的類實現(xiàn)。通過和對應(yīng)模塊的交互,就能對數(shù)據(jù)庫進(jìn)行增刪查改的操作。
要實現(xiàn)對數(shù)據(jù)庫的操作,必須在具體的類中調(diào)用具體的操作,例如update,delete,query等。由于所有的實現(xiàn)類都繼承SqlMapClientDaoSupport類 ,因此可以通過直接調(diào)用父類的方法,來實現(xiàn)對數(shù)據(jù)庫的操作。通過在applicationcontext-ibatis.xml中對持久化類bean的配置程序就可以自動尋找到每個接口的實現(xiàn)類。
以下例子是accetDaoImpl類中根據(jù)狀態(tài)得到列表的方法:
public List findAcceptByState(Map map) {
…
return this.getSqlMapClientTemplate().queryForList(
\"Accept.findAcceptByState\",map);
}
由此可以看出,直接調(diào)用父類的getSqlMapClientTemplate()就可以獲取對數(shù)據(jù)的操作。
要實現(xiàn)與業(yè)務(wù)邏輯層的對話,則需要在業(yè)務(wù)層的實現(xiàn)中注入持久層的接口。下面程序代碼是對acceptDao的實現(xiàn)。
在業(yè)務(wù)層配置文件的聲明:
<bean id=\"acceptManager\" class=\"com.sqzx.service.impl.AcceptManagerImpl\">
<property name=\"acceptDao\">
<ref bean=\"acceptDao\"/>
</property>
</bean>
由以上的實例代碼可以看出,業(yè)務(wù)層實現(xiàn)類中的方法通過對配置文件中的配置,調(diào)用特定的Dao接口完成具體業(yè)務(wù)對象的操作流程,這樣業(yè)務(wù)層就與持久層中的數(shù)據(jù)操作聯(lián)系起來。

4.3 業(yè)務(wù)邏輯層
Spring并沒有為實際的業(yè)務(wù)邏輯實現(xiàn)提供太多的支持,但是它對依賴注入、驗證和事務(wù)管理均提供了良好的支持,這使得它成為一個理想的業(yè)務(wù)層構(gòu)建平臺。
與持久層的類的設(shè)計相似,先對應(yīng)用程序中的服務(wù)對象定義一系列接口,所有與業(yè)務(wù)層交互的代碼都應(yīng)該通過這些接口進(jìn)行。例如,訴求受理acceptManager接口類與acceptManagerImpl實現(xiàn)類。如上配置中acceptManagerImpl通過注入持久層acceptDao接口,可以方便與數(shù)據(jù)庫進(jìn)行交互。
4.4 表示層
表示層負(fù)責(zé)管理用戶的請求和響應(yīng),并提供一個控制器將調(diào)用委托到具體對應(yīng)的業(yè)務(wù)邏輯和其他上游處理將業(yè)務(wù)操作的結(jié)果組裝在數(shù)據(jù)對象中表現(xiàn)到視圖上。這里將采用SpringMVC來實現(xiàn)表示層,根據(jù)不同責(zé)任對其進(jìn)行劃分。
4.4.1 視圖層
傳統(tǒng)的表示層使用HTML和Javascript技術(shù)將結(jié)果顯示在瀏覽器中,往往導(dǎo)致頁面出現(xiàn)很多邏輯代碼,這里通過使用JSTL標(biāo)簽來避免在JSP頁面上直接編寫,保持頁面的簡潔,提高腳本的重用性,有利于腳本的調(diào)試。視圖就由JSP頁面完成,將業(yè)務(wù)操作所得到的數(shù)據(jù)對象展示給用戶。
Spring實現(xiàn)了很多View接口的類,提供了對眾多視圖層實現(xiàn)的支持,通過在配置文件中定義org.springframework.web.servlet.view.InternalResourceViewResolver的屬性ViewClass的值為InternalResourceView來使用JSTL技術(shù)。InternalResourceView是一個常用的視圖類,用來處理Servlet和JSP。
4.4.2 模型層
在SpringMVC框架中,幾乎沒有實現(xiàn)Model層,因為并不需要MVC的框架來實現(xiàn)。它的實現(xiàn)取決與程序員對面向?qū)ο蠹夹g(shù)的掌握,這里用VO作為存數(shù)據(jù)載體來實現(xiàn)Model層。
4.4.3 控制器層
Spring的缺省處理器是一個簡單的控制器(Controller)接口,這個接口僅定義ModelAndView handleRequest(request,response)方法,所有開發(fā)人員自己實現(xiàn)的應(yīng)用控制器都必須實現(xiàn)這個接口。同時Spring還提供很多控制器實現(xiàn),例如AbstractController,Abstract CommandController和SimpleFormController。
通常每個控制器完成業(yè)務(wù)邏輯處理后,都將會返回ModelAndView對象,用來負(fù)責(zé)傳遞Model層處理后的結(jié)果集合和指定的View層信息。
通常在配置文件中的設(shè)置如下:
<bean id=\"acceptOutViewerController\" class=\"com. sqzx.web.controller.accept.AcceptOutViewerController\" parent=\"baseCommandControllerTemplate\">
…
<property name=\"acceptManager\">
<ref bean=\"acceptManager\"/>
</property>
…
</bean>
如圖6所示,通過注入業(yè)務(wù)層接口AcceptManager,實現(xiàn)了表示層與業(yè)務(wù)層的耦合。通過返回ModelAndView對象實現(xiàn)與Model層和View層通信。
5 結(jié) 語
Spring是一個利用依賴注入方式實現(xiàn)對象的初始化,使得開發(fā)人員不用自己在代碼中初始化對象,降低了系統(tǒng)的耦合度,Spring框架技術(shù)在系統(tǒng)設(shè)計中具有良好的設(shè)計思想。在表示層中Spring能較好地把業(yè)務(wù)邏輯和頁面分離,對數(shù)據(jù)庫操作和業(yè)務(wù)對象的管理,通過整合Spring和iBatis實現(xiàn)。通過對系統(tǒng)的分析及實現(xiàn)可以看出,Spring作為J2EE一個解決方案具有廣闊的應(yīng)用前景。

參考文獻(xiàn)
[1]Craig Walls.Ryan Breidenbach.Spring In Action[M].manning press,2006.
[2]郭峰.Spring從入門到精通[M].北京:清華大學(xué)出版社,2006.
[3]Martin Fowler. Inversion of Control Containers and the Dependency Injection Pattern. [C/OL].http://www. martinfowler.com/articles/injection.html,2004.
[4]王可.基于spring和hibernate的框架技術(shù)在聯(lián)通農(nóng)業(yè)信息平臺系統(tǒng)中的應(yīng)用研究[D].成都:西南交通大學(xué),2007.
[5]吳高峰.基于Struts+Spring+iBATIS的輕量級J2EE開發(fā)[EB/OL].http://www-128.ibm.com /develop-rworks/cn/ja-va/j-s-s-i/,2005.
[6]Clinton Begin,Brandon Goodin,Larry Meadors.Ibatis In Action[M].Manning Press,2007.
[7]閻宏.Java與模式[M].北京:電子工業(yè)出版社,2002.
[8]Johnson R. Introduction to the Spring Framework [EB/OL].2005-05.http://www.theserverside.com/articles/article.tss? l=SpringFramework.
[9]羅時飛.精通Spring[M].北京:電子工業(yè)出版社,2005.
[10]Apache Software Foundation. iBATIS Sql Maps Developer Guide[EB/OL]. http: //prdownloads. sourceforge. net/ibatisdb/,2005.
作者簡介 劉雙翼 男,1981年生,武漢人,碩士研究生。主要研究方向為數(shù)據(jù)挖掘與知識發(fā)現(xiàn)。
朱 莉 女,1952年生,江西人,教授,碩士生導(dǎo)師。主要研究方向為數(shù)據(jù)挖掘及其應(yīng)用。
李 向 男,1970年生,重慶人,副教授,博士研究生。主要研究方向為演化計算及其應(yīng)用。