李啟銳,陳曉龍
工作中到各個辦公室辦理業(yè)務(wù)是不可避免的,但是經(jīng)常遇到這種問題:當(dāng)帶好材料到辦公室門口才發(fā)現(xiàn),由于辦公室人員出差或其它原因,辦公室暫停對外開放,讓人白走一趟。解決這個問題的常用方法是出門之前先往該辦公室電話預(yù)約。
造成“吃閉門羹”的主要原因是辦公室的開放信息不能被方便地查詢。為此,本文分析了辦公室開放信息的建立、發(fā)布和查詢流程,設(shè)計了一個辦公室開放信息系統(tǒng)。在該系統(tǒng)中,通過網(wǎng)絡(luò)就可以查詢到所需信息,既不影響他人工作,又可以節(jié)省電話資源。
為了使用方便和提高跨平臺性,系統(tǒng)采用 B/S架構(gòu)模式,基于SSH框架技術(shù)實現(xiàn)。
系統(tǒng)主要實現(xiàn)辦公室信息的設(shè)置與查詢,包括辦公室信息管理、用戶管理、辦公室狀態(tài)設(shè)置和辦公室狀態(tài)查詢 4個功能模塊。辦公室分為兩個級別:第一級別是以大的機關(guān)處室為單位,如教務(wù)處等;第二級別是機關(guān)處室下的各個科室,如教育管理科等。機構(gòu)信息包括名字、負責(zé)人、職能描述、地址等信息。辦公室的信息包括名字、負責(zé)人、地址、職能描述等信息,二級科室還包括辦公室狀態(tài)信息,狀態(tài)分為正常、出差、開會、休假 4種。系統(tǒng)的用戶主要分為 3類,第一類是系統(tǒng)管理員,可以進行辦公室信息管理和用戶管理;第二類是辦公室人員,這類用戶分屬于各個二級科室,可以登錄系統(tǒng)設(shè)置辦公室的狀態(tài)信息;第三類是普通用戶,只能查詢辦公室的狀態(tài)信息。用戶管理包括對第二類用戶信息進行添加、刪除和修改。
SSH是目前流行的Java開源框架組合,它提出了一種開發(fā) J2EE應(yīng)用的輕量級解決方案[1]。利用 SSH 整合框架可以開發(fā)出一個分層的、易維護、可復(fù)用的企業(yè)級應(yīng)用系統(tǒng)[2]。
Struts2是一個可擴展的 JAVAEE Web框架,它不是Struts1的簡單升級,而是從 Web Work升級而來的新版Struts[3],它集成了輸入校驗、國際化、類型轉(zhuǎn)換、攔截器、標(biāo)簽庫等常用的Web編程技術(shù)。
Struts2實現(xiàn)了 MVC設(shè)計模,提供了開發(fā)MVC系統(tǒng)的底層支持。它將應(yīng)用程序分解為業(yè)務(wù)模型、控制器和視圖三大模塊,降低了各模塊之間的耦合度,提高應(yīng)用程序的可維護性和重用性。
在Struts2中,F(xiàn)ilterDispatcher作為主控制器由Struts2框架提供,它接收視圖傳送過來的請求,并分發(fā)到各個分控制器(Action)來處理。Action負責(zé)對某一個或多個特定的頁面請求的響應(yīng),調(diào)用相應(yīng)的業(yè)務(wù)邏輯來處理,并把結(jié)果數(shù)據(jù)提交到視圖顯示給用戶。Action由開發(fā)人員根據(jù)需要編寫。Struts2使用 stuts.xml來定義請求與Action、請求與處理方法、處理結(jié)果與視圖之間的對應(yīng)關(guān)系。stuts.xml是 Struts2的核心配置文件,與 Struts2相關(guān)的特殊配置項目都在該文件中設(shè)置。
Spring框架的目標(biāo)是解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性,具有兩大核心功能:控制反轉(zhuǎn)(IoC, Inversion of Control)和面向切面編程(AOP, Aspect Oriented Programming)。
IoC又稱為依賴注入(DI, Dependency Injection),其思想是當(dāng)某個Java實例(調(diào)用者)需要另一個Java實例時,不再需要調(diào)用者創(chuàng)建被調(diào)用者實例,這個工作由外部的協(xié)調(diào)者(如Spring容器)來完成。在這種設(shè)計模式中,對象與對象之間的依賴關(guān)系被從代碼中分離出來,通過配置文件進行動態(tài)管理,使得程序耦合度非常松散,對象的更換變得相當(dāng)簡單。
AOP是一種通過預(yù)編譯方式和運行期動態(tài)代理技術(shù),實現(xiàn)了在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的技術(shù)。利用這種技術(shù)可以將一些通用功能從不相關(guān)的類中分離出來,能夠使很多類共享一個行為,提高程序的重用性。這樣,一旦這種行為發(fā)生變化,不必修改很多類,只需要修改這個行為即可,提高程序的開發(fā)效率。Spring的事務(wù)處理就是AOP技術(shù)的典型應(yīng)用。
Hibernate是一個面向 Java環(huán)境的輕量級ORM(Object/Relation Mapping )工具,其作用是對Java類與關(guān)系數(shù)據(jù)庫表進行映射,完成數(shù)據(jù)的持久化,同時提供數(shù)據(jù)的查詢、一致性檢查、事務(wù)管理等機制[3]。應(yīng)用Hibernate,程序員可以完全使用面向?qū)ο蟮乃季S去操作數(shù)據(jù)庫,不必關(guān)心數(shù)據(jù)庫連接、事務(wù)處理等細節(jié)問題,這些細節(jié)的處理在傳統(tǒng)的使用SQL和JDBC編程中是不可避免的。因此,程序員可以從繁重的數(shù)據(jù)庫操作中釋放出來,集中精力處理系統(tǒng)的業(yè)務(wù)邏輯。另外,有了映射機制,程序代碼中不再需要出現(xiàn)如數(shù)據(jù)表名等數(shù)據(jù)庫元數(shù)據(jù)信息,進行數(shù)據(jù)庫移植時不需要修改代碼,提高系統(tǒng)的靈活性。
Web 應(yīng)用分層思想把一個Web應(yīng)用程序分為表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)存取層三個層次。與MVC模式相對應(yīng),表示層包含MVC模式中的視圖與控制器,而業(yè)務(wù)邏輯層和數(shù)據(jù)存取層則組成MVC模式中的模型。結(jié)合3 個框架各自的特點及Web 應(yīng)用分層思想,得出SSH整合的策略。Struts2實現(xiàn)了 MVC模式,有優(yōu)秀用戶交互功能,因此把 Struts2作為MVC的承載者,主要實現(xiàn)表示層功能。Hibernate是最好的ORM工具之一,使用它可以簡化數(shù)據(jù)庫的操作,主要用來實現(xiàn)數(shù)據(jù)存取層功能。整合過程以Spring 框架為核心:第一,使用它的Ioc機制實現(xiàn)表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)存取層之間的相互調(diào)用,降低各層之間的耦合度;第二,使用AOP機制實現(xiàn)數(shù)據(jù)存取層事務(wù)的統(tǒng)一管理,進一步簡化數(shù)據(jù)庫的操作。
在軟件體系架構(gòu)設(shè)計中, 分層式結(jié)構(gòu)是最常見, 也是最重要的一種結(jié)構(gòu)[4]。系統(tǒng)使用三層結(jié)構(gòu)設(shè)計,分別為表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)存取層。基于SSH的整合實現(xiàn),得出系統(tǒng)的總體結(jié)構(gòu),如圖1所示:
圖1 系統(tǒng)三層結(jié)構(gòu)模型
在此模型中,按照不同的功能把程序分3個層次,邏輯上相互獨立。層次之間的調(diào)用通過 Spring的依賴注入技術(shù)實現(xiàn),與一般的MVC模式相比較,程序更深層次地降低了模塊之間的耦合度,大大提高了程序的簡單性和可維護性。使用 Hibernate和 Spring進行數(shù)據(jù)持久化操作,與傳統(tǒng)的JDBC相比較,降低了程序復(fù)雜度,減少了一些重復(fù)性的工作,提高開發(fā)效率。
(1)表示層設(shè)計
表示層實現(xiàn)MVC模式中的視圖與控制器功能。該層為用戶提供一種交互式的操作界面,主要應(yīng)用Struts2技術(shù)實現(xiàn),方便調(diào)用其標(biāo)簽庫、輸入校驗、攔截器等功能。Struts2首先接收用戶的請求,把用戶的輸入通過 Action轉(zhuǎn)發(fā)給相應(yīng)的業(yè)務(wù)邏輯層來處理。接收到處理結(jié)果后調(diào)用相應(yīng)的視圖顯示給用戶。
控制器與視圖之間的數(shù)據(jù)傳輸主要通過 Action類中定義的屬性(提供getter和setter)及部分Servlet API來實現(xiàn)。主控制器通過解析struts.xml來實現(xiàn)不同的請求分發(fā)給不同的子控制器,并根據(jù)不同處理結(jié)果調(diào)用不同的視圖來顯示。
(2)業(yè)務(wù)邏輯層設(shè)計
業(yè)務(wù)邏輯層是針對具體問題的處理。該層根據(jù)表示層的請求,對輸入的數(shù)據(jù)進行加工處理后把結(jié)果返回給表示層。處理過程如果需要數(shù)據(jù)庫支持,則調(diào)用數(shù)據(jù)存取層從數(shù)據(jù)庫中存取數(shù)據(jù)。
(3)數(shù)據(jù)存取層設(shè)計
數(shù)據(jù)存取層負責(zé)一切數(shù)據(jù)庫操作,主要用Hibernate技術(shù)實現(xiàn)。同時使用 Spring進行統(tǒng)一的事務(wù)管理,把所有事務(wù)交給Spring自動完成處理,這只需要在Spring的核心配置文件中 applicationContext.xml中配置即可。Hibernate與Spring整合之后,DAO組件類還可以繼承 Sping提供的HibernateDaoSupport類,該類把數(shù)據(jù)庫的操作過程封裝成模板。使用模板可以大大簡化操作數(shù)據(jù)庫的程序。
根據(jù)以上結(jié)構(gòu)模型,系統(tǒng)的程序中至少有Action組件、Service組件和DAO組件需要編寫。這3種組件之間的相互調(diào)用由 Spring動態(tài)注入完成,其本質(zhì)是根據(jù)面向?qū)ο笾卸鄳B(tài)性的特點,使用接口編程實現(xiàn)。Action類通常從 Struts2框架提供的ActionSupport中繼承,因為ActionSupport中已經(jīng)定義好一些通用的用戶交互功能,如輸入檢驗等。Dao組件通常繼承Sping提供的HibernateDaoSupport類,簡化操作數(shù)據(jù)庫的編程方法。另外,系統(tǒng)中還有與關(guān)系數(shù)據(jù)表映射的持久化PO類。因此,得出系統(tǒng)的類圖,如圖2所示:
圖2 系統(tǒng)類圖
由于篇幅原因部分接口和類未在圖中列出。
基于SSH的系統(tǒng)可以很好地實現(xiàn)表現(xiàn)層、業(yè)務(wù)邏輯層及數(shù)據(jù)存取層的相互獨立, 使系統(tǒng)具有很好的穩(wěn)定性、可擴展性和可維護性,并能提高系統(tǒng)的開發(fā)效率。但目前這三個層次往往是在相同的應(yīng)用程序服務(wù)器上運行,對于大型的軟件系統(tǒng),容易造成服務(wù)器的負擔(dān)過重,如何有效地把 3個層次進行分開部署和運行,是值得繼續(xù)深入研究的問題。
[1]周文瓊,王樂球,湯君武, 曾慶斌.基于SSH呼叫中心排班系統(tǒng)的設(shè)計與實現(xiàn).軟件導(dǎo)刊[J], 2011(4):53-55
[2]李雷孝,劉曉軍,劉利民,包力.基于 SSH 整合框架的科研項目管理系統(tǒng)的設(shè)計與實現(xiàn).[J].內(nèi)蒙古農(nóng)業(yè)大學(xué)學(xué)報,2012(1):210-214
[3]張紅衛(wèi), 賈松濤,李曉,王磊.基于SSH的多語種構(gòu)件庫管理系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機應(yīng)用軟件,2010(5):139-142
[4]楊鐘鳴.基于 SSH框架的社區(qū)管理信息系統(tǒng)設(shè)計[J].東華理工大學(xué)學(xué)報(自然科學(xué)版),2010(4):379-383