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