俞新凱 曾光輝 毛敏
摘要:MVC設(shè)計(jì)模式是一種常用的設(shè)計(jì)模式,其在軟件工程中的復(fù)用程度非常高。在系列開(kāi)發(fā)技術(shù)規(guī)范中,有眾多基于MVC設(shè)計(jì)模式的框架工具。介紹了一種名為DIPO的基于MVC設(shè)計(jì)模式的開(kāi)發(fā)架構(gòu),其主要特點(diǎn)是能簡(jiǎn)化復(fù)雜的業(yè)務(wù)邏輯,使所有業(yè)務(wù)功能模塊的開(kāi)發(fā)流程都?xì)w結(jié)為“數(shù)據(jù)—輸入—處理—輸出”,從而使開(kāi)發(fā)工作變得簡(jiǎn)單、高效。DIPO架構(gòu)可以為B/S架構(gòu)的軟件項(xiàng)目開(kāi)發(fā)提供參考。
關(guān)鍵詞:MVC;開(kāi)發(fā)框架;軟件復(fù)用;DIPO;開(kāi)發(fā)流程
DOIDOI:10.11907/rjdk.151549
中圖分類(lèi)號(hào):TP303
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)
文章編號(hào):16727800(2015)006004103
作者簡(jiǎn)介作者簡(jiǎn)介:俞新凱(1975-),男,廣東韶關(guān)人,碩士,廣州城建職業(yè)學(xué)院機(jī)電與信息工程學(xué)院講師、系統(tǒng)分析師,研究方向?yàn)檐浖こ汤碚撆c方法、數(shù)據(jù)庫(kù)技術(shù)與理論、Java Web技術(shù)與Android應(yīng)用開(kāi)發(fā)。
0 引言
在當(dāng)今以互聯(lián)網(wǎng)技術(shù)為主導(dǎo)的軟件業(yè)界中,Web應(yīng)用軟件在數(shù)量上占據(jù)了相當(dāng)大的比重,無(wú)論是PC端還是移動(dòng)終端,都可以用瀏覽器來(lái)訪問(wèn)Web服務(wù)?;ヂ?lián)網(wǎng)上每天都在發(fā)布大量的Web應(yīng)用軟件,因此,如何在Web應(yīng)用開(kāi)發(fā)過(guò)程中采用高效的開(kāi)發(fā)流程,并且在其后續(xù)的升級(jí)改造中也能按照該流程進(jìn)行持續(xù)性開(kāi)發(fā),是大多數(shù)軟件企業(yè)和開(kāi)發(fā)者面臨的問(wèn)題。
Web應(yīng)用軟件采用的軟件架構(gòu)是典型的B/S模式,前端展現(xiàn)層為瀏覽器,后端為HTTP服務(wù)器,如果將應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)服務(wù)器分離,則形成三層結(jié)構(gòu)體系,即“瀏覽器—Web服務(wù)器—數(shù)據(jù)庫(kù)”。
MVC設(shè)計(jì)模式是解決三層結(jié)構(gòu)體系的重要設(shè)計(jì)模式,但MVC也僅是給出抽象的解決方案,而未給出具體實(shí)現(xiàn)過(guò)程的技術(shù)解決方案。不少軟件組織專門(mén)為三層結(jié)構(gòu)開(kāi)發(fā)了基于MVC設(shè)計(jì)模式的開(kāi)源架構(gòu)和工具,如Struts、Spring等。由于這些開(kāi)發(fā)架構(gòu)為了滿足大多數(shù)Web應(yīng)用軟件的開(kāi)發(fā)需要和眾多的功能技術(shù)需求,在不斷的版本升級(jí)中變得越來(lái)越龐大,而對(duì)于某一個(gè)應(yīng)用軟件而言,其使用到的功能只是這些開(kāi)源框架中的一小部分,為此卻不得不在自己的應(yīng)用中加入大量依賴插件,使程序變得十分厚重,不便于長(zhǎng)期開(kāi)發(fā)和維護(hù)。筆者在總結(jié)多年的Web應(yīng)用軟件開(kāi)發(fā)的經(jīng)驗(yàn)基礎(chǔ)上,設(shè)計(jì)出一套能實(shí)現(xiàn)MVC設(shè)計(jì)模式的輕量級(jí)開(kāi)發(fā)框架,以滿足大多數(shù)輕量級(jí)的Web應(yīng)用程序設(shè)計(jì)要求。
1 MVC設(shè)計(jì)模式
MVC設(shè)計(jì)模式的主導(dǎo)思想是將軟件系統(tǒng)分為3層:①M(fèi)odel(模型層):負(fù)責(zé)實(shí)現(xiàn)系統(tǒng)中每個(gè)業(yè)務(wù)模塊的邏輯細(xì)節(jié),對(duì)輸入的數(shù)據(jù)進(jìn)行加工處理,并輸出返回給前端頁(yè)面。模型層通常要對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀取與存儲(chǔ)操作;②View(視圖層):直接面向用戶的系統(tǒng)界面,負(fù)責(zé)往后臺(tái)業(yè)務(wù)層傳遞用戶輸入的參數(shù),并接收從后臺(tái)業(yè)務(wù)單元返回的結(jié)果數(shù)據(jù)。視圖層的主要作用是接收用戶發(fā)出的請(qǐng)求,以及把系統(tǒng)的處理結(jié)果展現(xiàn)給用戶;③Controller(控制器):是系統(tǒng)中負(fù)責(zé)聯(lián)系模型層和視圖層的中間橋梁,起調(diào)度作用。在涉及數(shù)據(jù)轉(zhuǎn)發(fā)、視圖選擇、安全認(rèn)證、系統(tǒng)環(huán)境配置等方面事務(wù)時(shí),通常由控制器負(fù)責(zé)完成[1]。
MVC體系結(jié)構(gòu)采用分治的思想,實(shí)現(xiàn)了表示層與數(shù)據(jù)層的分離。MVC分層有助于管理復(fù)雜的系統(tǒng)邏輯,視圖層和模型層通過(guò)數(shù)據(jù)交換接口實(shí)現(xiàn)兩者之間的數(shù)據(jù)對(duì)接。在視圖層通常采用標(biāo)簽語(yǔ)言的形式擷取數(shù)據(jù),而在模型層則用控制器提供的數(shù)據(jù)接口接收和輸出數(shù)據(jù)。MVC分層體系還簡(jiǎn)化了不同分工的開(kāi)發(fā)人員的開(kāi)發(fā)復(fù)雜度,使其可以相對(duì)獨(dú)立地完成開(kāi)發(fā)任務(wù)。開(kāi)發(fā)視圖層與開(kāi)發(fā)模型層的人員可以并行工作,只要在同一個(gè)控制器下,遵循統(tǒng)一的數(shù)據(jù)標(biāo)準(zhǔn)即可[2]。圖1描述了MVC設(shè)計(jì)模式的邏輯模型。
2 DIPO框架介紹
2.1 DIPO設(shè)計(jì)理念
DIPO全稱為“Data—Input—Process—Output”,即“數(shù)據(jù)—輸入—處理—輸出”,它以簡(jiǎn)化系統(tǒng)開(kāi)發(fā)流程、提高軟件復(fù)用程度為目標(biāo)。從開(kāi)發(fā)者的角度看待系統(tǒng),任何系統(tǒng)的所有功能模塊,都可以歸結(jié)為“數(shù)據(jù)—輸入—處理—輸出”這條處理流程,系統(tǒng)中任何一次請(qǐng)求與響應(yīng)的處理過(guò)程,都可以看作是一個(gè)Action Unit(活動(dòng)單元),每個(gè)活動(dòng)單元即是一次“Data—Input—Process—Output”的實(shí)施過(guò)程。
因此,無(wú)論是從設(shè)計(jì)上的抽象層到實(shí)現(xiàn)中的具體層,還是從軟件的開(kāi)發(fā)期到運(yùn)行期,都遵循這樣一個(gè)簡(jiǎn)單流程,使系統(tǒng)的設(shè)計(jì)、開(kāi)發(fā)、維護(hù)、升級(jí)都變得輕量級(jí)且易于擴(kuò)展。
DIPO開(kāi)發(fā)框架采用MVC設(shè)計(jì)模式[3],可以完成諸如界面呈現(xiàn)、視圖分派、用戶交互、數(shù)據(jù)刷新、定時(shí)調(diào)度、對(duì)象傳輸、安全控制、應(yīng)用環(huán)境配置等眾多功能;前端采用W3C標(biāo)準(zhǔn)的系列語(yǔ)言,包括HTML、CSS、JavaScript,其中還大量使用了Ajax技術(shù);在數(shù)據(jù)傳輸模式上涵蓋了WebService、HTTP、FTP、DTO(數(shù)據(jù)傳輸對(duì)象)、Socket、RMI(遠(yuǎn)程方法調(diào)用)等,還集成了J2EE技術(shù)體系中的眾多部件,可以與不同框架體系的系統(tǒng)進(jìn)行標(biāo)準(zhǔn)化的數(shù)據(jù)交換。
2.2 DIPO與MVC的關(guān)系
DIPO框架是實(shí)現(xiàn)MVC設(shè)計(jì)模式的一種具體的框架技術(shù),同時(shí)也對(duì)MVC作了進(jìn)一步改造,其中包括:
(1)DIPO中的Data在MVC模式中未直接體現(xiàn)出來(lái)。將Data擴(kuò)展出來(lái)的主要意義在于讓開(kāi)發(fā)者對(duì)所有原始數(shù)據(jù)和加工數(shù)據(jù)予以高度關(guān)注。因?yàn)閿?shù)據(jù)由始至終都代表著用戶對(duì)于系統(tǒng)的真正意圖,系統(tǒng)所做的一切都是圍繞著數(shù)據(jù)展開(kāi)的。因此,Data才是用戶與系統(tǒng)共同關(guān)注的核心要素。
(2)DIPO中的Input和Output對(duì)應(yīng)于MVC中的視圖層,即將MVC中的View分解成輸入——Input,與輸出——Output。在這種設(shè)計(jì)思想的引導(dǎo)下,開(kāi)發(fā)者可以清晰地區(qū)分視圖層中哪些是用戶對(duì)系統(tǒng)的請(qǐng)求,哪些是系統(tǒng)對(duì)用戶的響應(yīng),把數(shù)據(jù)來(lái)源和去向弄清楚,才能準(zhǔn)確無(wú)誤地處理好業(yè)務(wù)單元。
(3)DIPO中的Process對(duì)應(yīng)于MVC中的模型和控制器,再度對(duì)MVC模式作了簡(jiǎn)化。因?yàn)榭刂破魇强蚣芴峁┱咴趹?yīng)用系統(tǒng)開(kāi)發(fā)前,就已按照框架的復(fù)用機(jī)制定制好的,所以框架的第三方開(kāi)發(fā)者可以不必關(guān)注控制層的具體細(xì)節(jié),而將主要開(kāi)發(fā)精力投入到具體的界面設(shè)計(jì)和業(yè)務(wù)處理邏輯上。
3 DIPO框架開(kāi)發(fā)流程
基于DIPO開(kāi)發(fā)框架的應(yīng)用系統(tǒng),在用戶與系統(tǒng)進(jìn)行任何一次交互動(dòng)作時(shí),都是以一個(gè)Action(活動(dòng)單元)作為基本粒度。一條常規(guī)的DIPO開(kāi)發(fā)流程如下(以新增機(jī)構(gòu)交易為例):
(1)定義該活動(dòng)的輸入數(shù)據(jù)項(xiàng)(上級(jí)機(jī)構(gòu)、機(jī)構(gòu)名稱、機(jī)構(gòu)類(lèi)型等)、輸出數(shù)據(jù)項(xiàng)(機(jī)構(gòu)名稱、操作結(jié)果)。
(2)為這個(gè)交互活動(dòng)命名一個(gè)txcode(交易碼),名為DeptAdd。
(3)在配置文件actionlist.xml中為交易碼DeptAdd添加一個(gè)節(jié)點(diǎn),指明該交易要調(diào)用的程序單元為DeptMng,即一個(gè)Java程序,并且指明在程序處理完畢后,要將結(jié)果發(fā)布到哪一個(gè)視圖中(可以是JSP、HTML、TXT、圖片、導(dǎo)出下載文件等),如DeptList.jsp。
(4)為DeptAdd交易指定一個(gè)觸發(fā)點(diǎn),分為以下3種情況:①通過(guò)系統(tǒng)菜單項(xiàng),用戶在主界面上點(diǎn)擊對(duì)應(yīng)菜單項(xiàng)即可觸發(fā)該交易;②通過(guò)系統(tǒng)中某個(gè)頁(yè)面中的用戶操作觸發(fā),如按鈕、按鍵、表單提交等;③在執(zhí)行多個(gè)交易串行處理過(guò)程中,DeptAdd交易是其中一個(gè)環(huán)節(jié)。
新增機(jī)構(gòu)交易DeptAdd屬于上述的第一種方式,即通過(guò)系統(tǒng)菜單項(xiàng)獲得該交易的入口點(diǎn)。
(5)編寫(xiě)一個(gè)Java程序DeptAdd.class作為交易活動(dòng)處理單元,完成對(duì)用戶傳入?yún)?shù)如上級(jí)機(jī)構(gòu)ID、本級(jí)機(jī)構(gòu)名稱的數(shù)據(jù)處理。如果合法,則向系統(tǒng)添加一條機(jī)構(gòu)數(shù)據(jù)。
(6)如果DeptAdd交易涉及對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和更新操作,則還需要編寫(xiě)相關(guān)的數(shù)據(jù)庫(kù)表以及SQL語(yǔ)句來(lái)執(zhí)行完成過(guò)程。
(7)編寫(xiě)響應(yīng)(返回)頁(yè)面。在本例中,DeptList.jsp是交易處理完畢后的響應(yīng)(返回)頁(yè)面,頁(yè)面編寫(xiě)屬于靜態(tài)界面設(shè)計(jì)部分,其中的動(dòng)態(tài)數(shù)據(jù)則由活動(dòng)單元返回的參數(shù)來(lái)實(shí)時(shí)更新。
4 結(jié)語(yǔ)
從上述開(kāi)發(fā)流程可以看出,遵循“Data—Input—Process—Output”的步驟,可以使開(kāi)發(fā)流程變得十分簡(jiǎn)單、清晰,包括“什么樣的數(shù)據(jù)(Data)”、“從哪里傳入(Input)”、“由哪個(gè)單元處理(Process)”、“輸出到哪里去(Output)”。
DIPO開(kāi)發(fā)框架是一套筆者于2009開(kāi)發(fā)成型的Web應(yīng)用開(kāi)發(fā)框架,并已成功地推廣到多家企業(yè)的Web應(yīng)用。其基于MVC設(shè)計(jì)模式,迎合了當(dāng)今大多數(shù)軟件開(kāi)發(fā)者的模式取向。同時(shí)采用Java程序語(yǔ)言開(kāi)發(fā)后端程序,采用HTML、CSS、JavaScript和Ajax開(kāi)發(fā)前端界面,使視圖層、業(yè)務(wù)層、數(shù)據(jù)庫(kù)可以分別交給不同的開(kāi)發(fā)人員進(jìn)行并行開(kāi)發(fā),而中間的控制層則由DIPO框架自身實(shí)現(xiàn),無(wú)需第三方開(kāi)發(fā)者另行開(kāi)發(fā),從而大大提高了開(kāi)發(fā)效率。
參考文獻(xiàn):
[1]任廣震,侯進(jìn),王獻(xiàn).MVC模式在B/S結(jié)構(gòu)政務(wù)系統(tǒng)的應(yīng)用研究[J].計(jì)算機(jī)應(yīng)用與軟件,2014 (8):5458,74.
[2]羅麗娟,陳永政.淺談MVC框架模式[J].科學(xué)咨詢,2013(2):1213.
[3]李麗,顧明.基于J2EE的系統(tǒng)設(shè)計(jì)方法和模式比較[J].計(jì)算機(jī)應(yīng)用研究,2002(11):3842.
[4]周輝,任海軍,馬亮,等.MVC設(shè)計(jì)模式及其在信息系統(tǒng)開(kāi)發(fā)中的應(yīng)用[J].軟件導(dǎo)刊,2012,11(10):120122.
責(zé)任編輯(責(zé)任編輯:黃 健)
英文摘要Abstract:The MVC design pattern is a common pattern in software engineering. A project based on MVC pattern is highly reused. There are many framework tools based on MVC in serial of software development standards. This article mainly produces a framework named DIPO based MVC. DIPO aims to simplify business logical and implement detail,put the development process of all business models in a flow,called “Data—Input—Process—Output”. DIPO framework may be a reference to software development project.
英文關(guān)鍵詞Key Words: MVC;Development Framework;Software Reuse;DIPO;Development Process