王爽
(西安體育學院網絡管理中心,陜西西安710068)
大型運動會在全國乃至全世界都有著重要的影響,但是對于運動會的管理工作卻是一件比較復雜的事情。如果采用人工處理的方法進行運動會數據輸入、處理和發布,不僅速度慢、效率低、容易出錯,而且也不便于與當前運動會的外圍顯示系統和綜合信息發布系統進行數據共享和信息發布,迫切需要開發一種在網絡環境下運行的,符合實際需要的運動會信息管理系統[1]。因此,利用計算機技術、網絡通信技術、數據庫技術等實現運動會信息的管理,對于減輕繁重的手工勞動,提高工作效率和管理水平,實現運動會管理的信息化和現代化具有重要的現實意義。傳統的開發方法難以快速開發出功能強大、系統可擴展性強的基于Web的應用系統。而一個優秀成熟的框架既可以提高開發效率,又可以保障系統質量。本文將ASSH(AJAX+Struts+Spring+Hibernate)框架引入了運動會信息管理系統應用的開發中,對整合的架構應用進行具體的研究。
系統在物理上由3部分組成,第1部分:前端具有WLAN功能的手持PDA或計算機,以便通過無線網絡與數據處理計算機進行通信,第2部分:數據處理計算機,整個系統的核心部件,包括了所有基礎信息處理的功能。第3部分:數據庫服務器,用于存儲各種基礎信息[2]。
本系統選用J2EE平臺。J2EE的跨平臺操作性很強,可搭建具有可伸縮性、靈活性、易維護性的系統。系統開發基于B/S的三層體系結構,分別是:表示層,位于最上層,離用戶最近,用于顯示數據和接收用戶輸入的數據,為用戶提供一種交互式操作的界面。業務邏輯層:負責處理用戶輸入的信息,或者是將這些信息發送給數據訪問層進行保存,或者是調用數據訪問層中的函數再次讀出這些數據,業務邏輯層也可以包括一些“業務邏輯”描述代碼。持久層:實現對數據的保存和讀取操作。由于采用了三層架構,使得數據的存儲在后臺數據庫服務器上完成,業務功能由成績處理計算機即應用程序服務器完成。采用該模式,客戶端不直接與數據庫服務器相連接,提高了數據庫的安全性。更重要的是,對體育比賽而言,當競賽項目的業務邏輯發生微調時,只需修改成績處理計算機上的程序即可,而不需要對客戶端進行任何改動。
運動會信息管理系統涵蓋以下子系統:
1)系統維護子系統是公用子系統,負責為其它子系統提供公共信息,管理用戶、設置用戶權限和維護系統日志。
2)賽事管理子系統是基本子系統,負責為其它子系統提供運動會信息和比賽項目信息。其中包括注冊系子統,賽制設置子系統,場館管理子系統,比賽主計劃子系統,賽程編排子系統[3]。
3)運動會成績系統運動會成績系統是運動會的核心系統,包括:中心成績系統、場館成績系統、現場計時記分系統。
4)運動會信息發布子系統運動會信息發布系統是運動會對外發布的窗口將涵蓋:
①信息網站;②電視轉播字幕系統;③打印分發系統;④現場LED顯示屏系統。
AJAX指異步JavaScript及XML,借助于AJAX,可以在用戶單擊按鈕或鏈接時,利用JavaScript和DHTML立即更新用戶界面,并向服務器發出異步請求,以執行更新或查詢。當請求返回時,就可以使用JavaScript和CSS相應地更新用戶界面,而不是刷新整個頁面,這種特性決定了它適用于需要與服務端頻繁交互,操作即時響應要求高的環境。采用AJAX技術可以減少數據傳輸量以及加快響應速度[4]。
Struts框架,它是一個完美的MVC實現,它有一個中央控制類(一個Servlet),針對不同的業務,用Action類負責頁面跳轉和后臺邏輯運算,Jsp頁面負責數據的輸入和輸出顯示,Form類負責傳遞Action和Jsp中間的數據。Jsp中可以使用Struts框架提供的一組標簽,就像使用html標簽一樣簡單,但是可以完成非常復雜的邏輯。但如果把運算邏輯都放在Struts的Action類里將使得Action類復用度低和邏輯混亂,所以通常會把整個Web應用程序分為3層,Struts負責表示層,它調用業務邏輯層完成運算邏輯,業務邏輯層再調用持久層完成數據庫的讀寫。
Struts調用業務類時,需要新建一個業務類出來,然后使用,業務邏輯層需要調用持久層的類,也需要新建一個持久層類出來用。簡單的說,就是調用者依賴被調用者,它們之間形成了強耦合,如果想在其他地方復用某個類,則這個類依賴的其他類也需要包含。程序就變得很混亂,每個類互相依賴互相調用,復用度極低。如果一個類做了修改,則依賴它的很多類都會受到牽連。
Spring框架,它的作用就是完全解耦類之間的依賴關系,一個類如果要依賴什么,那就是一個接口。只要有一個實現了這個接口的類,就可以輕松的通過xml配置文件把實現類注射到調用接口的那個類里。所有類之間的這種依賴關系就完全通過配置文件的方式替代了。所以Spring框架最核心的就是依賴注射和控制反轉。
Hibernate框架,可以創建一系列的持久化類,每個類的屬性都可以簡單的看做和一張數據庫表的屬性一一對應,也可以實現關系數據庫的各種表間關聯的對應。當需要相關操作時,不用再關注數據庫表,不用再去一行行的查詢數據庫,只需要持久化類就可以完成增刪改查的功能。使軟件開發真正面向對象,而不是面向混亂的代碼,使用Hibernate可以比JDBC方式減少很多的編程量[5]。
另外,由于Spring使用的依賴注射以及AOP(面向方面編程),所以它的這種內部模式非常優秀,同時為了很好的處理事物,Spring集成了Hibernate,使事物管理從Hibernate的持久層提升到了業務層,使用更加方便。
現在的架構是,Struts負責表示層,AJAX則作為Struts在表示層上的補充,Spring負責中間的業務層,Hibernate負責持久層,形成了ASSH框架,其架構如圖1所示。采用上述架構,不僅實現了視圖、控制器與模型的徹底分離,而且還實現了表示層、業務邏輯層與持久層的分離。這樣無論前端如何變化,模型層只需很少的改動,并且數據庫的變化也不會對前端有所影響。系統采用此架構開發,無論在整體架構還是在局部的復雜業務模型中都有了更低的耦合性,而且提高了靈活性與可維護性、可擴展性及可重用性。而且由于不同層之間耦合度小,有利于團隊成員并行工作,大大提高了開發效率。在性能速度、交互性和體驗上也有很大的改善,這樣便消除了單獨使用這些框架開發系統的不足[6]。

圖1 ASSH框架架構圖Fig.1Frame structure of ASSH
Struts、Spring、Hibernate的優勢分別在于J2EE的表示層,業務邏輯層,持久層。本系統中集成框架的具體做法是用面向對象的分析方法根據需求來提出一個模型,將這些模型采用Java語言來實現出基本的Java對象,然后寫出基本的DAO(數據訪問對象)接口,并給出Hibernate的DAO實現,這樣就可以通過Hibernate框架實現的DAO類來實現Java類與數據庫之間的轉換和訪問,然后由Spring來完成業務邏輯處理。在此架構中,由Struts負責降低系統總架構的耦合性,由Spring負責復雜的業務邏輯處理,由Hibernate負責降低模型部分的開發難度,由AJAX負責在頁面進行監聽和異步處理。
系統的基本業務流程是:在表示層中,首先通過AJAX和JSP頁面實現交互界面,負責傳送請求(Request)和接收響應(Response),然后Struts根據配置文件(Struts-config.xml)將ActionServlet接收到的Request委派給相應的Action處理。在業務邏輯層中,管理服務組件的Spring IOC容器負責向Action提供業務模型組件和該組件的協作對象數據處理(DAO)組件完成業務邏輯,并提供事務處理、緩沖池等容器組件以提升系統性能和保證數據的完整性。而在持久層中,則依賴于Hibernate的對象化映射和數據庫交互,處理DAO組件請求的數據,并返回處理結果。
本系統使用Hibernate框架實現應用的持久層,封裝訪問數據庫的實現細節,并向上層提供面向對象的數據訪問API。創建Hibernate框架為應用服務,分為如下3個步驟:1)創建O/R Mapping(對象關系映射)文件;2)創建Hibernate配置文件;3)通過Hibernate API實現具體的DAO數據訪問。
Hibernate通過O/R映射文件將對象與關系型數據相關聯,因此需要編寫和數據庫表相對應的Java持久化類以及對應的映射文件[7]。有了Java持久化類后就可以在此基礎上實現數據訪問類。在Spring框架中,數據訪問類可以從輔助類HibernateDaoSupport繼承,這極大地方便了Hibernate框架在Spring中的使用。以下是用戶管理模塊中,Hibernate映射文件User.hbm.xml的部分代碼。
<class
name=“com.sun.Hibernate.system.User”
table=“SYSTEM_USER”>
<id name=“id”type=“long”column=“ID”>
<generator class=“sequence”>
<param name=“sequence”>seq_user</param>
</generator>
</id>
<property name=“name”type=“java.lang.String”column=“NAME”length=“10”/>
<propertyname=“password”type=“java.lang.String”column=“PASSWORD”length=“10”/>
……
<many-to-one name=“role”
class=“com.sun.Hibernate.system.Role”insert=“false”
update=“false”>
<column name=“ROLEID”/>
</many-to-one>
具體的Hibernate數據源、Session工廠、事務管理、緩沖連接池等功能都由業務邏輯層的Spring容器提供。
業務邏輯層由Spring框架支持,提供了處理業務邏輯的服務組件。開發者需要對業務對象建模,抽象出業務模型并封裝在模型組件中。由于數據持久層實現了Java持久化類并且封裝了DAO,因此可以在模型組件中方便地調用DAO組件來存取數據[8]。Spring的IoC容器負責統一管理模型組件和DAO組件以及Spring所提供的事務處理、緩沖連接池等服務組件。
例如:在用戶管理模塊中,通過業務建模創建了用戶模型UserService類,封裝了對用戶的權限管理等功能。UserService類通過調用數據訪問類UserDao實現對用戶數據的操作。這些組件的關系將通過配置Spring框架的applicationContext.xml聯系起來,配置文件的部分代碼如下:
<beanid=“userDAO”class=“com.sun.Spring.system.UserDAOImpl”>
<property name=“sessionFactory”><ref local=“sessionFactory”/></property>
</bean>
<bean id="userDAOProxy"
class=“org.Springframework.transaction.interceptor.
TransactionProxyFactoryBean”>
<property name=“transactionManager”><ref bean=“transactionManager”/></property>
<property name=“target”><ref local=“userDAO”/></property>
……
</bean>
<bean name=“/user”class=“com.sun.Struts.actions.system.UserAction”singleton=“false”>
<propertyname=“userDAO”><refbean=“userDAOProxy”/></property>
……
</bean>
本系統中表示層主要由Struts框架,AJAX技術實現,設計嚴格依照MVC模式,其中V(視圖層)通過Jsp頁面實現,C(控制層)由Servlet實現,M(模型層)則由Action及AJAX后臺程序實現,下面舉系統中的一個例子來說明Struts和AJAX在表示層的應用。在管理人員添加頁面中,當用戶在Jsp頁面中填寫完人員姓名、密碼等信息后,JavaScript中相應的XMLHttpRequest回調函數將異步派發XMLHttpRequest請求,后臺將根據提供的姓名、密碼從數據庫相應表中得到該人員個人基本信息。隨后服務器響應會傳到瀏覽器,在解析請求參數后,Servlet執行必需的應用邏輯,將響應信息封裝到XML中,并將它寫回HttpServletResponse。客戶端注冊在XMLHttpRequest上的回調函數現在會被回調,用以處理由服務器返回的數據,并通過更新用戶界面來響應服務器傳輸過來的數據[9]。信息完成后提交時,所有需要保存的數據通過表單提交給相應的Servlet。由其根據配置文件調用相應Action進行后續處理。這樣做的好處是使視圖層、控制層、模型層完全分離,同時加入了AJAX的異步處理功能,使系統無論是在安全性、可擴展性還是交互性上較之普通設計都有明顯提高。
控制器是按Struts-config.xml文件中的配置來決定業務流的轉向,開發人員在業務流控制方面的主要工作是對Strutsconfig.xml進行配置[10],Struts-config.xml部分代碼如下:
<form-bean name=“userForm”
type=“com.sun.Struts.forms.system.UserForm”/>
</form-beans>
<global-forwards>
<forward name=“index”path=“/index.Jsp”/>
<forward name=“login”path=“/login.Jsp”/>
……
</global-forwards>
<action-mappings>
……
<action path=“/user”name=“userForm”validate=“false”parameter=“method”
type=“org.Springframework.Web.Struts.DelegatingActionProxy”>
……
<forward name=“password”path=“/pages/system/user/password.Jsp”/>
</action>
在Struts-config.xml文件中定義保存HTTP表單對應的Form和對應的Action類。Form Bean必須在Struts-config.xml進行正確配置后,才能被程序引用。
系統采用AJAX+Struts+Spring+Hibernate開源框架技術。在此架構中,表示層采用Struts,業務邏輯層采用Spring,數據持久層選擇Hibernate。整個架構能夠很好地實現控制流、業務調用、表示這3者的分離,集成后的框架具備了3種框架的技術優勢,將Struts的MVC機制,Spring的反轉控制機制以及Hibernate的O/R Mapping映射機制融合在一起,此架構在系統開發簡潔性、開發效率、開發成本以及維護費用等方面有著很大的優勢,同時,采用了當下十分流行的AJAX技術,這使系統具有更加完美的用戶體驗。
[1]劉槐德.高校運動會綜合信息管理系統的設計與實現[D].重慶:重慶大學,2009:9-10.
[2]宋依青,李書旗,王海濱.基于WLAN的分布式競賽打分系統的設計與實現[J].微電子學與計算機,2009,26(11):165-168.SONGYi-qing,LIShu-qi,WANGHai-bin.Designand realization of distributional competition grading system based on the WLAN[J].Microelectronics&Computer,2006,26(11):165-168.
[3]蒲川江.奧運比賽管理系統分析與設計及關鍵技術研究[D].北京:清華大學,2005:14-16.
[4]Woolston D.Pro Ajax and the NET 2.0 platform[M].LosAngeles,California,USA:Wager T Press,2006.
[5]李剛.輕量級企業應用實戰—Struts+Spring+Hibernate整合開發[M].北京:電子工業出版社,2007.
[6]傅鸝,殷旻昊.基于Struts+Spring+Hibernate+Ajax技術的科研管理系統設計[J].軟件導刊,2009,8(1):134-136.FU Li,YIN Min-hao.Design of research management system based on Struts+Spring+Hibernate+Ajax technology[J].Software Guide,2009,8(1):134-136.
[7]諶湘倩,狄文輝,孫冬.基于SSH框架與AJAX技術的Java Web應用開發[J].計算機工程與設計,2009,30(10):2590-2592.CHEN Xiang-qian,DI Wen-hui,SUN Dong.Application of Java Web Based on SSH and AJAX[J].Computer Engineering and Design,2009,30(10):2590-2592.
[8]楊波,劉淵,冷文浩.基于Struts+Hibernate+Spring架構的船舶數字化平臺的設計與實現[J].計算機應用與軟件,2008,25(2):1409-1412.YANG Bo,LIU Yuan,LENG Wen-hao.Ship digitized platform based on architecture of Struts&Hibernate&Spring[J].Computer Applications and Software 2008,25(2):1409-1412.
[9]肖杰,陳翔,何海江,等.基于AJAX和Struts的Web應用的設計與實現[J].計算機工程與設計,2009,30(8):1934-1938.XIAO Jie,CHEN Xiang,HE Hai-jiang,et al.Design and implementation of Web application based on AJAX and Struts[J].Computer Engineering and Design,2009,30(8):1934-1938.
[10]王軍豪,彭巖.Hibernate+Struts+Spring整合技術在電子政務中的應用[J].計算機工程與設計,2008,29(6):1409-1412.WANG Jun-hao,PENG Yan.Application of Hibernate+Struts+SpringintegratetechnologyinE-government[J].Computer Engineering and Design,2008,29(6):1409-1412.