饒 浩
(韶關(guān)學(xué)院信息管理系,韶關(guān)512005)
MVC模式下的Web系統(tǒng)快速開發(fā)框架設(shè)計?
饒 浩
(韶關(guān)學(xué)院信息管理系,韶關(guān)512005)
討論了一種基于MVC(Model模型,View視圖,Controller控制器)模式的Web信息系統(tǒng)快速開發(fā)框架,描述了開發(fā)框架的設(shè)計,介紹了數(shù)據(jù)庫API封裝、對象關(guān)系映射、URL映射表等操作。系統(tǒng)開發(fā)被抽象為MVC結(jié)構(gòu),開發(fā)過程在業(yè)務(wù)規(guī)則之下進(jìn)行最根本的數(shù)據(jù)模型操作,很好地把系統(tǒng)業(yè)務(wù)剝離出來實現(xiàn)??焖匍_發(fā)框架的開發(fā)周期比較短,開發(fā)效率比較高,從開發(fā)和維護(hù)等角度相比較,比傳統(tǒng)的開發(fā)方式更具優(yōu)勢。
模型-視圖-控制器模式;信息系統(tǒng);對象關(guān)系映射
在當(dāng)今的信息時代,人們在商業(yè)、貿(mào)易、經(jīng)濟(jì)等方方面面都離不開信息交互,而在信息交互過程中,Web扮演著非常重要的角色。
在傳統(tǒng)方法的Web應(yīng)用開發(fā)中,系統(tǒng)業(yè)務(wù)和界面融合一體。開發(fā)人員除了要構(gòu)建核心的業(yè)務(wù)數(shù)據(jù)以外,還往往需要花費(fèi)很多時間和精力處理業(yè)務(wù)數(shù)據(jù)的流動及其展現(xiàn)。在做一個應(yīng)用的時候,往往需要編寫大量的數(shù)據(jù)庫查詢操作,頻繁地在各種邏輯混雜的代碼中加插經(jīng)常變化的控制邏輯,使得系統(tǒng)的管理和維護(hù)十分艱難。
Web信息系統(tǒng)快速開發(fā)框架基于MVC模型進(jìn)行設(shè)計,開發(fā)周期比較短,開發(fā)效率比較高。通過對象關(guān)系映射把數(shù)據(jù)表映射到對象,并為對象定義幾個基本方法來處理數(shù)據(jù),使開發(fā)人員能夠把主要精力放在業(yè)務(wù)數(shù)據(jù)的處理之上,盡量減少其他邏輯的處理。開發(fā)框架將控制器分離出來,通過控制器連接界面和系統(tǒng)業(yè)務(wù),其關(guān)系為松耦合。松耦合后的系統(tǒng)更加便于維護(hù)和管理。控制器采用MVC實現(xiàn),即Model(業(yè)務(wù)模型)、View(用戶界面)、Controller(控制器)模式。
圖1 開發(fā)框架工作流程圖
MVC模式為Web開發(fā)者提供多項功能,具備對數(shù)據(jù)模型方便直觀的操作方法。在傳統(tǒng)的Web開發(fā)過程中建立數(shù)據(jù)表,對每行數(shù)據(jù)操作,在快速開發(fā)框架中都被映射成對象。對于每個數(shù)據(jù)模型對象,都有幾個基本的方法,方便進(jìn)行對象的獲取、插入、修改等操作。視圖能方便地展示業(yè)務(wù)邏輯處理的結(jié)果。視圖是Web開發(fā)最終需要展示給用戶的內(nèi)容,體現(xiàn)了Web信息系統(tǒng)的根本目的,具有統(tǒng)一的控制器,用于調(diào)度對業(yè)務(wù)邏輯的請求,以及視圖的產(chǎn)生。這是用戶請求某個業(yè)務(wù)并且得到反饋的必經(jīng)之路,提供簡明的數(shù)據(jù)模型管理工具。為了方便開發(fā)者對數(shù)據(jù)模型的管理維護(hù),需要提供友好的用戶界面來完成這個功能。維護(hù)的內(nèi)容包括對數(shù)據(jù)的增加、刪除、更新、統(tǒng)計等基本功能。
系統(tǒng)由Model、View、Controller、數(shù)據(jù)管理后臺、命令行接口五個子系統(tǒng)有機(jī)組合而成。Model部分支撐起對數(shù)據(jù)庫的封裝,實現(xiàn)統(tǒng)一的存取方法;View部分實現(xiàn)純粹的展現(xiàn)內(nèi)容的分離處理;Controller部分用于對整個系統(tǒng)進(jìn)行調(diào)度,包括對請求映射到對應(yīng)的業(yè)務(wù)邏輯的處理;數(shù)據(jù)管理后臺實現(xiàn)對用戶定義模型的管理;命令行接口通過命令行提示的形式,提供友好的開發(fā)向?qū)А?/p>
2.1 Model子系統(tǒng)
Model(業(yè)務(wù)模型)表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分。業(yè)務(wù)模型通過構(gòu)件對象來處理數(shù)據(jù)庫。一個業(yè)務(wù)模型能為多個視圖提供數(shù)據(jù),減少代碼重復(fù)。Model子系統(tǒng)由兩個部分組成,一是對數(shù)據(jù)庫API(Application Programming Interface,應(yīng)用程序編程接口)和SQL(Structured Query Language,結(jié)構(gòu)化查詢語言)語句的封裝,二是完成ORM(Object Relational Mapping,對象關(guān)系映射)操作。
為了把開發(fā)者從繁雜的數(shù)據(jù)庫操作中解放出來,也為了跨數(shù)據(jù)庫的遷移更加方便,通過給數(shù)據(jù)庫加一個API封裝層的方法,使得所有對數(shù)據(jù)庫的操作,都經(jīng)過這個層的調(diào)用。這樣寫出來的程序,具有更好的移植性。對于SQL方式,要為每個支持的數(shù)據(jù)庫編寫一個處理函數(shù),這個處理函數(shù)會檢查或者解析整個SQL語句,修改成自己能夠支持的語句,然后執(zhí)行。
對于對象關(guān)系映射,可采用的辦法是把數(shù)據(jù)表映射到Python(一種計算機(jī)編程語言)類,在這個映射中,數(shù)據(jù)表被映射成類,每行記錄都被映射成相應(yīng)的對象,而列則被映射成為對象的屬性。對于對象的處理,主要有兩種情況,一種是從數(shù)據(jù)庫獲取一個對象,另外一種是產(chǎn)生一個對象,然后存到數(shù)據(jù)庫里面。
數(shù)據(jù)庫對象有幾個靜態(tài)方法,分別是:conn()、insert(obj)、delete(id)、get(id)、getMany(start,n)、getMany(CriteriaBox)等。Conn()方法用于連接數(shù)據(jù)庫,如果該數(shù)據(jù)庫引擎是無連接的引擎,則直接返回成功;insert(obj)用于往數(shù)據(jù)庫插入一個對象;delete(id)用于根據(jù)id從數(shù)據(jù)庫刪除一個對象;get(id)用于根據(jù)id從數(shù)據(jù)庫來獲取一個對象;getMany(start,n)用于從數(shù)據(jù)庫的start條記錄處開始獲取n條記錄;getMany(CriteriaBox)則會根據(jù)開發(fā)者定義好的CriteriaBox對象作為限制參數(shù)從數(shù)據(jù)庫獲取符合要求的id。
對象關(guān)系映射的一個重要問題是對象的每個屬性必須能夠保持特定的數(shù)據(jù)類型,而不能都是字符串類。為了處理這個問題,可對每種數(shù)據(jù)庫對應(yīng)的類型,都定義一個類來處理,在定義數(shù)據(jù)類的時候,每個成員都要定義成一個數(shù)據(jù)類型對象。
要應(yīng)用這套框架,需要掌握Python語言的基本語法。在本框架中,數(shù)據(jù)已經(jīng)基本交給ORM來進(jìn)行處理。ORM的好處是只需花費(fèi)開發(fā)者較少的時間就能對數(shù)據(jù)對象進(jìn)行基本操作,從而把注意力集中在對數(shù)據(jù)本身的操作,而不需要理會數(shù)據(jù)查詢細(xì)節(jié)。視圖的產(chǎn)生邏輯也比較簡單,主要頁面都已經(jīng)讓模板系統(tǒng)來處理,減輕了開發(fā)人員的負(fù)擔(dān)。
2.2 Controller子系統(tǒng)
Controller負(fù)責(zé)在應(yīng)用程序中處理用戶交互的部分??刂破鹘邮苡脩糨斎?,確定調(diào)用哪個模型構(gòu)件去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù)。
Controller子系統(tǒng)包含兩方面的設(shè)計,一是http請求處理部分,二是把請求的路徑映射到對應(yīng)的指定View。
Controller首先是一個基于能夠正確處理http請求的Web server,Web server接受到請求以后,會根據(jù)相應(yīng)的請求路徑在urls列表里面查找相應(yīng)的view函數(shù),然后把請求的內(nèi)容交由view來處理,最后把view函數(shù)返回的內(nèi)容返回給客戶端。
為了處理URL請求,正確匹配要使用的View視圖,最直接的辦法是建立一個從url到View的映射表。但是由于在Web開發(fā)中,url的個數(shù)往往非常多,所以僅僅使用全字符串來定義映射,會相當(dāng)麻煩。不過由于url的目錄層次結(jié)構(gòu),很容易找到相同點(diǎn),并且相同的目錄,往往是同一個View來處理。所以需要規(guī)則來指定映射關(guān)系的方式,規(guī)則可以是正則表達(dá)式或者是完全匹配的url路徑。比如”^/custom_url/[0-9]*.do:custom_view”這個映射表定義了讓custom_url下的任意數(shù)字+”.do”的頁面的請求,都交由custom_view這個View處理。
2.3 View子系統(tǒng)
View負(fù)責(zé)應(yīng)用程序中處理數(shù)據(jù)顯示部分。用戶界面是依據(jù)模型數(shù)據(jù)創(chuàng)建的由HTML(HyperText Markup language,超文本標(biāo)記語言)元素組成的視圖,包括Adobe Flash和XHTML,XML/XSL,WML等一些標(biāo)識語言和Web services。
View子系統(tǒng)被設(shè)計成一個單獨(dú)的模塊,并且默認(rèn)包含了Model的所有定義。在View中可以訪問所有的Model對象。每個單獨(dú)的View被設(shè)計成簡潔的一個Python函數(shù),只需要返回要產(chǎn)生的頁面內(nèi)容即可。對于需要使用模板產(chǎn)生頁面的View,可采用Python中decorator的辦法,decorator是一個修飾函數(shù),這個修飾函數(shù)包含上下文定義以及處理模板文件的相關(guān)功能,能方便地根據(jù)開發(fā)者指定的模板文件以及當(dāng)前的上下文來返回模板引擎產(chǎn)生的內(nèi)容。開發(fā)人員只需要在view函數(shù)返回幾個需要處理的變量,用于構(gòu)造上下文,在view函數(shù)之前,聲明要使用這個decorator并指定模板文件的名字即可。
2.4 數(shù)據(jù)管理后臺
后臺數(shù)據(jù)庫管理起到輔助作用,幫助開發(fā)人員方便地完成增加,修改和刪除對象的操作,在一定程度上加快了開發(fā)。從后臺功能來看,無非都是對數(shù)據(jù)庫內(nèi)模型對象的幾個基本操作—增加、刪除、修改。很容易便能想到直接利用現(xiàn)有的模型對象的基本方法來操作。因此,自動化后臺要做的主要工作,就是遍歷開發(fā)者的模型定義文件,得到所有的模型對象,然后在Web上面展現(xiàn)這些模型對應(yīng)的操作方法,以及現(xiàn)有數(shù)據(jù)的瀏覽等。后臺需要運(yùn)行在Web環(huán)境下面,以一個命令行的格式實現(xiàn),主要輸入”./frameworkshell runadmin”即可通過8001端口訪問這個后臺。實現(xiàn)的方式是在開發(fā)人員定義的Model里面遍歷所有對象,看其是否有需要后臺的標(biāo)志位。如果需要,就按照它們的屬性來生成相應(yīng)表單。其中基本的增加、修改、刪除幾個操作,只要調(diào)用對象本身已定義的方法即可。
2.5 命令行接口
命令行接口的實現(xiàn)比較直觀,事先盡量定義好所有的操作,然后對每個操作進(jìn)行一些實際任務(wù)的實現(xiàn)。開發(fā)環(huán)境提供了一個系統(tǒng)級命令”frameworkshell”,開發(fā)者使用這個shell可以創(chuàng)建項目,語法是”./frameworkshell startproject projectname”,生成一個項目文件的目錄,里面包含Model類定義文件、URL映射關(guān)系定制文件、網(wǎng)站配置文件、視圖定義文件、管理當(dāng)前網(wǎng)站的腳本等多個重要文件。
啟動一個Web項目需要一些初始文件,例如Model定義文件、View定義文件、Controller配置文件,以及少數(shù)幾個額外的配置文件用于指定數(shù)據(jù)庫類型、網(wǎng)站主機(jī)地址、端口、路徑等。為此,可以在框架中集成一個命令行的界面來支持這個操作,命令行盡可能簡潔。例如”./webframework startproject projectname”命令能讓系統(tǒng)自動在當(dāng)前目錄生成proojectname目錄和基本的文件,用戶可以從直接使用目錄下的幾個文件開始自己的項目。
應(yīng)用MVC進(jìn)行Web系統(tǒng)的開發(fā)是一個數(shù)據(jù)庫驅(qū)動的開發(fā)過程,步驟如下:
3.1 創(chuàng)建系統(tǒng)項目
創(chuàng)建系統(tǒng)項目直接使用下面的命令行:
3.2 設(shè)置數(shù)據(jù)庫和網(wǎng)站
上面設(shè)置了使用sqlite3作為sql引擎。
3.3 創(chuàng)建兩個對象
上面定義了兩個類,然后使用框架提供的管理工具來根據(jù)這兩個定義創(chuàng)建數(shù)據(jù)表:
Python manage.py syncdb
接著即可以在數(shù)據(jù)庫里面看到表了。
3.4 創(chuàng)建View
創(chuàng)建一個用戶的view,修改view.py
在上面的render_from_template()這個decorator中,指定了從add_person_result模板產(chǎn)生頁面,而這個模板的內(nèi)容如下:
3.5 定義url映射
修改urls.py
3.6 運(yùn)行web服務(wù)
同樣,使用框架提供的manage.py來運(yùn)行服務(wù):Python manage.py runserver
3.7 結(jié)果測試
直接打開sqlite3數(shù)據(jù)庫testdatabase,可以看到用戶表已經(jīng)添加了一個新用戶,順利完成操作。
4.1 在ORM對象中使用鍵下標(biāo)方式訪問屬性
Python語言提供了__setattr__(key,value)和__getattr__(key)兩個方法,能夠輕松的用鍵值來對屬性的設(shè)置和取值進(jìn)行處理。
4.2 外鍵關(guān)系的解決
根據(jù)外鍵關(guān)系,數(shù)據(jù)表之間形成了一對多或者從屬的關(guān)系。在數(shù)據(jù)庫對象映射中,可以給對象定義has_many和belongs_to兩個表,通過設(shè)置這兩個表,讓程序根據(jù)這兩個表來建立一對多和從屬的關(guān)系。
4.3 多種數(shù)據(jù)庫不兼容的問題
對于多種數(shù)據(jù)庫,主要不同體現(xiàn)在一些SQL語句,以及SQL功能上。所以在可替換底層數(shù)據(jù)庫這方面考慮,設(shè)計一種封裝SQL語句和數(shù)據(jù)庫操作的方法,例如使用一個DB類來封裝基本的數(shù)據(jù)庫操作。對SQL語句兼容方面的解決方案也不只一個,例如對SQL語言進(jìn)行封裝,使用的時候解析;或只取SQL各種數(shù)據(jù)庫的交集部分;又或使用一個最通用的語法,遇到不支持該語句格式的數(shù)據(jù)庫時,在該數(shù)據(jù)庫內(nèi)部進(jìn)行相應(yīng)轉(zhuǎn)換。
當(dāng)Web瀏覽器向系統(tǒng)發(fā)送一個http請求時,MVC框架將使用其url路徑選擇引擎,將請求映射到控制器上的method,控制器根據(jù)不同的請求來調(diào)用不同的業(yè)務(wù)邏輯處理程序,負(fù)責(zé)處理進(jìn)來的請求、處理用戶輸入和交互、執(zhí)行基于這些輸入和交互的應(yīng)用邏輯、獲取或更新數(shù)據(jù)庫中的數(shù)據(jù)等。通過區(qū)分視圖和業(yè)務(wù)邏輯,使得開發(fā)過程更加清晰明了。
應(yīng)用快速開發(fā)框架進(jìn)行Web信息系統(tǒng)的開發(fā),工作效率比傳統(tǒng)的Web開發(fā)有較大提高。Web開發(fā)被抽象為MVC模式,開發(fā)人員所要做的,是在業(yè)務(wù)規(guī)則之下進(jìn)行最根本的數(shù)據(jù)模型操作。同時,系統(tǒng)的表示層被單獨(dú)剝離出來實現(xiàn),從開發(fā)和維護(hù)的角度來說,都比傳統(tǒng)開發(fā)模式更具條理性和可維護(hù)性。
[1] 趙增敏,吳潔,唐惠康.基于Code First模式的ASP.NETMVC應(yīng)用開發(fā)[J].制造業(yè)自動化,2012,34(6):154-156.
ZHAO Zengmin,WU Jie,TANG Huikang.ASP.NET MVC application development based on code firstmodel[J].Manufacturing Automation,2012,34(6):154-156.
[2] 聶新明,文元美,劉桂雄.LED燈具布局平臺中MVC設(shè)計模式的研究與實現(xiàn)[J].現(xiàn)代制造工程,2012(9):135-138.
Nie Xinming,WenYuanmei,Liu Guixiong.Research and implement of the MVCmode in LED lamps’layout platform[J].Modern Manufacturing Engineering,2012(9):135-138.
[3] 許暢,楊燕,王帥.一種基于MVC模式的Portlet開發(fā)框架的設(shè)計與實現(xiàn)[J].計算機(jī)科學(xué),2012,39(7):119-122.
XU Chang,YANG Yan,WANG Shuai.Design and Implementation of an MVC-based Framework for Developing Portlet[J].Computer Science,2012,39(7)119-122.
[4] 劉江平,倪小剛,李艷.基于MVC模式的ERP資源管理系統(tǒng)[J].內(nèi)蒙古農(nóng)業(yè)大學(xué)學(xué)報,2013(2):170-172.
LIU Jiangping,NI Xiaogang,LI Yan.The ERP Management System base on MVC Pattern[J].Journal of Inner
Mongolia Agricultural University,2013(2):170-172.
[5] 周文紅.基于ASP.NET MVC框架的Web應(yīng)用開發(fā)[J].計算機(jī)與現(xiàn)代化,2013(10):197-199.
ZHOUWenhong.Development ofWeb Application Based on ASP.NETMVC Framework[J].Computer and Modernization,2013(10):197-199.
Design of Rapid Development Framework ofWeb System Based on MVC Model
Rao Hao
(Department of Information Management,Shaoguan University,Shaoguan 512005,China)
The rapid development framework of web information system based on Model,View and Controller(MVC)model is discussed and analyzed in this paper.The object relation mapping,wrapper APIand URL mapping table are introduced.The system,regarded as MVC structure,through the basic datamodel operation,is implemented separately in functions.As its shorter development cycle and higher efficiency development process,in development and maintenance,it hasmore advantages than the traditional one.
MVCModel;Information System;Object Relational Mapping
10.3969/j.issn.1002-2279.2015.03.019
TP311;C931
A
1002-2279(2015)03-0069-04
2013年教育部人文社會科學(xué)研究項目(13YJCZH144)
饒浩(1976-),男,廣東興寧人,副教授,碩士,主研方向:信息管理與信息系統(tǒng)。
2014-11-07