王 丹
(遼寧省交通高等??茖W(xué)校,遼寧 沈陽 110122)
目前還有很多高校進(jìn)行串調(diào)課時(shí),仍然是教師填寫申請單,然后需要分別到教研室、院系辦公室和教務(wù)處簽字,教務(wù)處再根據(jù)教室的使用情況進(jìn)行調(diào)整,這樣不僅效率低下,而且浪費(fèi)了很多人力、物力。隨著互聯(lián)網(wǎng)的普及,開發(fā)一套網(wǎng)上串調(diào)課系統(tǒng),教師在辦公室或家里,就可以通過網(wǎng)上串調(diào)課系統(tǒng)進(jìn)行申報(bào),而教研室、系部和教務(wù)處等相關(guān)部門,也可以從網(wǎng)上進(jìn)行審批,從而解決了上述的問題。
本系統(tǒng)采用當(dāng)前比較流行的網(wǎng)絡(luò)開發(fā)語言Java、基于MVC模式的Struts框架以及為了系統(tǒng)擴(kuò)展的多層架構(gòu)設(shè)計(jì)模式。下面針對本系統(tǒng)所采用的技術(shù)以及本系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)進(jìn)行說明。
MVC(Model-View-Controller)模式是由模型、視圖和控制器組成的,被廣泛地應(yīng)用于大型可擴(kuò)展的Web軟件開發(fā)中,為交互式應(yīng)用程序開發(fā)提供了結(jié)構(gòu)化設(shè)計(jì)模型?;凇胺侄沃钡乃枷耄褂脩粢晥D(View)、控制器(Controller)與模型(Model)分離開來,結(jié)構(gòu)清晰,不僅能夠有效地存儲和展現(xiàn)數(shù)據(jù)對象中的功能模塊,同時(shí)又大大降低了模塊之間的耦合度。
在MVC模式中,傳統(tǒng)的輸入、處理和輸出被映射到3個(gè)方面,即表現(xiàn)、業(yè)務(wù)和控制。模型由應(yīng)用程序數(shù)據(jù)和業(yè)務(wù)規(guī)則組成,它是應(yīng)用程序的核心,控制數(shù)據(jù)訪問和數(shù)據(jù)更新。視圖負(fù)責(zé)模型內(nèi)容的表現(xiàn),它從模型接收數(shù)據(jù)并決定數(shù)據(jù)顯示形式。當(dāng)模型發(fā)生變化時(shí),它將通知視圖保持?jǐn)?shù)據(jù)的一致性??刂破髫?fù)責(zé)受影響的模型和視圖的動作和事件,它接收客戶端請求并將它們映射到模型的實(shí)現(xiàn)操作,并返回結(jié)果到視圖。在MVC處理中,每個(gè)客戶端輸入請求首先由控制器接收,控制器決定哪個(gè)模型處理它,然后,模型根據(jù)業(yè)務(wù)邏輯處理請求。最后,視圖顯示用戶結(jié)果。
Struts是在J2EE平臺上應(yīng)用日益廣泛的Web應(yīng)用程序框架。Struts框架實(shí)現(xiàn)了模型—視圖—控制器(MVC)設(shè)計(jì)模式,它將Model,View和Controller分別映射到Web應(yīng)用系統(tǒng)中的組件,通過在Web頁面中使用Struts框架定義的標(biāo)簽,實(shí)現(xiàn)頁面表示層與數(shù)據(jù)層的分離,從而使頁面更加簡潔、易于管理。
模型包含業(yè)務(wù)邏輯,并與永久性存儲進(jìn)行交互,以存儲、重新檢索和操作數(shù)據(jù)。視圖負(fù)責(zé)將結(jié)果返回給用戶。在Struts中,視圖層是使用JSP實(shí)現(xiàn)的??刂破魈幚韥碜杂脩舻乃姓埱螅⑦x擇合適的視圖返回。在Struts中,控制器的工作是由Action Servlet完成的。當(dāng)Action Servlet收到請求時(shí),將所有請求值捆綁到Java Bean類中,該類擴(kuò)展了Struts Action Form類。決定要調(diào)用哪個(gè)Action類來處理請求。驗(yàn)證用戶輸入的數(shù)據(jù)。Action類在模型組件的幫助下處理請求。該模型與數(shù)據(jù)庫交互并處理請求。在完成請求處理之后,Action類將一個(gè)Action Forward返回給控制器。
傳統(tǒng)的客戶/服務(wù)器(Client/Server,C/S)體系結(jié)構(gòu),在軟件伸縮性、可管理性、安全性、軟件重用性和資源形態(tài)上都難以滿足要求。架構(gòu)3層式軟件開發(fā)體系結(jié)構(gòu),將數(shù)據(jù)處理邏輯或業(yè)務(wù)邏輯從兩層結(jié)構(gòu)中提取出來,形成中間業(yè)務(wù)層,中間層可能運(yùn)行在不同于客戶機(jī)的其他機(jī)器上,經(jīng)過合理的任務(wù)劃分與物理部署后,可使得整個(gè)系統(tǒng)的工作負(fù)載更趨均衡,從而提高整個(gè)系統(tǒng)的運(yùn)行效率。
由于Struts框架很好地實(shí)現(xiàn)了MVC的設(shè)計(jì)模式,本系統(tǒng)設(shè)計(jì)中,以Struts所框架作為基礎(chǔ),連接前臺顯示層和后臺的業(yè)務(wù)層。在業(yè)務(wù)層和數(shù)據(jù)之間,本系統(tǒng)專門設(shè)計(jì)了數(shù)據(jù)訪問對象(Data Access Object,DAO)層,把業(yè)務(wù)層和數(shù)據(jù)庫具體操作分開,這樣不僅提高了開發(fā)效率,并且易于維護(hù)。
本系統(tǒng)共劃分了5層:HTML/JSP/Servlet為操作界面顯示層;Struts Action為邏輯控制層;業(yè)務(wù)對象為業(yè)務(wù)層;DAO數(shù)據(jù)訪問層;關(guān)系數(shù)據(jù)庫。
在技術(shù)結(jié)構(gòu)設(shè)計(jì)的基礎(chǔ)上,對串調(diào)課系統(tǒng)的業(yè)務(wù)進(jìn)行分析,得出了串調(diào)課系統(tǒng)結(jié)構(gòu),如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)
串調(diào)課系統(tǒng)從用戶操作界面的角度分為5部分:登錄、基本信息、串調(diào)課管理、系統(tǒng)管理和消息管理,它們分別通過Struts Action與業(yè)務(wù)對象進(jìn)行交互。由于登錄部分的業(yè)務(wù)對象放在了系統(tǒng)管理中,因此在系統(tǒng)結(jié)構(gòu)圖中,業(yè)務(wù)對象少于操作界面層。
由于Structs Action設(shè)計(jì)非常固定,而數(shù)據(jù)庫設(shè)計(jì)符合第三范式即可,因此下面主要從操作界面、業(yè)務(wù)對象和數(shù)據(jù)訪問3方面的實(shí)現(xiàn),進(jìn)行詳細(xì)說明。
B/S結(jié)構(gòu)的操作界面基本是Html/JSP/Servlet,其中JSP是最常用,并且是最多的。JSP的各種標(biāo)簽,如按鈕、文本框、下拉框等,為了保持它們的界面風(fēng)格統(tǒng)一,本系統(tǒng)采用自定義標(biāo)簽,定義屬性文件,當(dāng)然也可以采用Struts提供的一些標(biāo)簽。
在系統(tǒng)中,除了對界面風(fēng)格提供了屬性配置文件外,并為了最大限度地減少JSP頁面中的Java代碼,對JSP頁面中的操作進(jìn)行了封裝。現(xiàn)在以基本信息中內(nèi)部職員為例進(jìn)行說明,建立一個(gè)內(nèi)部職工信息頁面:personlist.jsp,該網(wǎng)頁包含3個(gè)通用網(wǎng)頁:common.jsp,list_tool_top.jsp和list_data.jsp。
common.jsp頁面中導(dǎo)入了常用類、Struts標(biāo)簽、自定義標(biāo)簽、頁面CSS樣式文件、JavaScript函數(shù)文件和共同變量等。list_tool_top.jsp包含了查詢、刪除、保存、修改、排序等通用操作的邏輯處理,界面操作按鈕、分頁和操作類型的標(biāo)簽等。list_data.jsp文件主要用于數(shù)據(jù)顯示的功能。
personlist.jsp除了包含上述3個(gè)文件外,還需要定義本功能模塊Action的target。因此,personlist.jsp作為一個(gè)完整功能模塊的數(shù)據(jù)操作界面,需要編寫的代碼行數(shù)僅有10行左右。
業(yè)務(wù)對象(Business Object,BO)是對真實(shí)世界的實(shí)體軟件抽象,它包含數(shù)據(jù)和行為,它們對應(yīng)著數(shù)據(jù)庫中的一條或多條記錄,盡管不同業(yè)務(wù)之間的差距非常大,但是它們都共享一些公共的屬性,例如版本號、描述、操作者、操作時(shí)間、表名、列數(shù)等。
在本系統(tǒng)中由于涉及多個(gè)業(yè)務(wù)對象:如系部、專業(yè)、內(nèi)部職員、串調(diào)課等,因此定義了一個(gè)抽象父類Base Business Object,它包含了業(yè)務(wù)對象所用到的公共屬性,所有的業(yè)務(wù)對象都必須繼承此父類。如果涉及后續(xù)串調(diào)課系統(tǒng)的調(diào)整或內(nèi)容增加,還可以對該類進(jìn)行擴(kuò)充。
由于在本系統(tǒng)中,由于所有的業(yè)務(wù)對象都需要訪問數(shù)據(jù)庫,因此在本系統(tǒng)中引用了DAO設(shè)計(jì)模式,DAO模式提供了訪問關(guān)系型數(shù)據(jù)庫系統(tǒng)所需的所有操作接口,DAO模式將底層數(shù)據(jù)訪問操作與高層業(yè)務(wù)邏輯分離開,對上層提供面向?qū)ο蟮臄?shù)據(jù)訪問接口。
本系統(tǒng)設(shè)計(jì)了Data Access Object類,它封裝了所有的數(shù)據(jù)庫的操作,并且使用連接池,提高系統(tǒng)的性能。并且通過讀取配置文件,可以設(shè)置不同的數(shù)據(jù)庫驅(qū)動,連接不同的數(shù)據(jù)庫,例如SQL Server,Oracle,MySQL等,使系統(tǒng)具有了通用性,在不同的數(shù)據(jù)庫之間實(shí)現(xiàn)無縫轉(zhuǎn)換。
本串調(diào)課系統(tǒng)雖然是一個(gè)相對簡單的網(wǎng)絡(luò)應(yīng)用系統(tǒng),但它的最大特點(diǎn)是不僅采用了當(dāng)前非常流行的網(wǎng)絡(luò)開發(fā)技術(shù),并且應(yīng)用了MVC和DAO等多種設(shè)計(jì)模式,把串調(diào)課系統(tǒng)的具體業(yè)務(wù)和網(wǎng)絡(luò)應(yīng)用通用功能進(jìn)行了區(qū)分,并對通用功能進(jìn)行了封裝,形成了一個(gè)通用框架,不僅易于維護(hù),還可實(shí)現(xiàn)代碼重用,可以對類似網(wǎng)絡(luò)應(yīng)用系統(tǒng)開發(fā)作為參考和借鑒。