亓雪冬, 韓立峰
(中國石油大學(xué)(華東)信息化建設(shè)處, 山東 青島 266580)
隨著Web業(yè)務(wù)需求的不斷增長,MVC設(shè)計模式和基于MVC的Web框架被持續(xù)研究和關(guān)注,如冉啟武等[1]設(shè)計了基于MVC模式的教學(xué)管理電子信息系統(tǒng);張翠翠等[2]研究了基于MVC的試卷生成及主觀題判卷算法;王俊芳等[3]研究和應(yīng)用了基于MVC模式的ThinkPHP框架;Majida Laaziri等[4]評估了Laravel、Smfony和CodeIgniter三種PHP Web框架并對其性能進行了測試;Andri Sunardi等[5]對比了Laravel和Slim兩種PHP Web框架并研究了在自由職業(yè)者項目監(jiān)控系統(tǒng)中的應(yīng)用效果。眾多研究表明,MVC模式通過對應(yīng)用的分層和解耦,減少了架構(gòu)設(shè)計的復(fù)雜性,增加了代碼的靈活性和可重用性;而MVC Web框架通過提供基礎(chǔ)框架模型和類庫,減少了Web應(yīng)用開發(fā)中的重復(fù)代碼,提高了開發(fā)效率和可維護性。
本文在研究MVC設(shè)計模式的基礎(chǔ)上,分析了Web應(yīng)用的一般性需求,提出了MVC Web框架的設(shè)計思路,并基于該框架設(shè)計實現(xiàn)了程序設(shè)計實訓(xùn)Web系統(tǒng)。
MVC設(shè)計模式最初于上世紀80年代誕生于Smalltalk語言中,近年來被廣泛應(yīng)用于Java EE、Web等平臺的軟件開發(fā)中。MVC全稱為Model-View-Controller,Model指數(shù)據(jù)模型,View指視圖(用戶界面),而Controller則指控制器。MVC的目的是將Model和View分離,從而使同一個程序可以使用不同的表現(xiàn)形式。MVC強制使應(yīng)用程序的輸入、處理和輸出分開設(shè)計,將程序主體分離為模型、視圖、控制器3個核心部件,實現(xiàn)功能的解耦。模型-視圖-控制器三者間的關(guān)系,如圖1所示。
圖1 MVC架構(gòu)示意圖
控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求,它本身不做任何處理,也不輸出任何數(shù)據(jù)。單擊Web頁面中的超鏈接和發(fā)送HTML表單時,它只是接收請求并決定調(diào)用哪個模型去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù),相當(dāng)于模型和視圖的粘合邏輯。
模型表示數(shù)據(jù)和業(yè)務(wù)規(guī)則,它返回的數(shù)據(jù)是中立的,與數(shù)據(jù)格式無關(guān),因此一個模型能夠為多個視圖提供數(shù)據(jù),減少了代碼的重復(fù)性。
視圖為用戶提供一種展示和操作數(shù)據(jù)的方式。不同的視圖代表多個不同的用戶界面。實際的處理操作發(fā)生在模型部分而不是視圖部分。在Web應(yīng)用程序,視圖通常由HTML元素、模板標(biāo)記語言以及模型返回的數(shù)據(jù)共同組成。
本文設(shè)計的Web框架遵循MVC設(shè)計模式,核心類包括控制器基類Controller、模式基類Model、用于生成視圖的模板類Template和工具類Request。整體架構(gòu),如圖2所示。
圖2 整體架構(gòu)設(shè)計圖
控制器基類Controller邏輯上依賴于類Model和類Template,內(nèi)部包含了Model和Template的實例,其目的是粘合這兩個類的功能,選擇合適的Model獲取數(shù)據(jù),并選擇合適的模板生成視圖。模式基類Model包含了操縱數(shù)據(jù)的基本業(yè)務(wù)邏輯,如查找、保存、更新和刪除數(shù)據(jù)等方法。模板類Template內(nèi)部封裝了第三方的模板引擎Smarty,實現(xiàn)內(nèi)存數(shù)據(jù)到HTML格式視圖的轉(zhuǎn)換。工具類Request實現(xiàn)了Web請求數(shù)據(jù)的封裝、請求的派發(fā)等功能,將Web請求轉(zhuǎn)發(fā)到指定的控制器。
該架構(gòu)將Controller與Model的業(yè)務(wù)邏輯層作為應(yīng)用的主要開發(fā)區(qū)域,上層應(yīng)用程序只需繼承Controller和Model,根據(jù)業(yè)務(wù)實際需求實現(xiàn)對應(yīng)子類UserControl和UserModel,即可完成業(yè)務(wù)邏輯開發(fā)。
index.php為Web請求的入口地址。Web請求到達后,index.php首先將Web請求中攜帶的各種數(shù)據(jù)進行封裝以便后續(xù)使用;接下來將Web請求派發(fā)到指定控制器,由控制器完成對請求的后續(xù)處理。
Requset:: dispatch()方法實現(xiàn)了控制器調(diào)度,其思路為:
(1) 從Web請求的Get數(shù)據(jù)中提取ct和ac兩個參數(shù)的值,這兩個參數(shù)表示執(zhí)行處理的控制器Controller以及控制器的具體操作Action;
(2) 將預(yù)設(shè)的控制器文件目錄、上一步操作中提取的控制器名稱以及字符串“.php”三部分合成控制器類文件完整路徑,使用require語句包含該控制器類;
(3) 創(chuàng)建該控制器的實例,并調(diào)用實例中參數(shù)ac所指的Action方法,完成控制器調(diào)度。
控制器設(shè)計包含兩個層次,Controller基類和UserController子類?;愔邪琈odel和Template的實例,方便粘合模式和視圖。但基類中并未實現(xiàn)任何Action方法,這部分留給子類根據(jù)業(yè)務(wù)邏輯具體實現(xiàn)。
控制器完成業(yè)務(wù)邏輯后,將調(diào)用模板類Template,將返回的數(shù)據(jù)和指定的模板合成視圖,向用戶展示W(wǎng)eb應(yīng)用界面。Template類基于第三方的模板引擎Smarty,模板文件使用Smarty的語法,擴展名為tpl。Template類公開了assign和display兩個方法,assign將控制器返回的數(shù)據(jù)替換入模板,display根據(jù)模板語言對模板進行解釋,生成最終的視圖。
模式的設(shè)計圍繞操縱和處理數(shù)據(jù)展開。在業(yè)務(wù)系統(tǒng)中,數(shù)據(jù)表現(xiàn)為關(guān)系數(shù)據(jù)庫中的關(guān)系(表);然而在軟件設(shè)計中,數(shù)據(jù)表現(xiàn)為內(nèi)存中的對象。為了實現(xiàn)關(guān)系與內(nèi)存對象之間的數(shù)據(jù)轉(zhuǎn)換,本文在模式層設(shè)計了輕量級、可擴展的對象-關(guān)系映射(Object/Relation Mapping,簡稱ORM)機制,相關(guān)設(shè)計類,如圖3所示。
圖3 模式部分類圖
DbManager是直接操縱數(shù)據(jù)庫的抽象基類,connect屬性表示數(shù)據(jù)庫連接對象,config屬性表示數(shù)據(jù)庫配置字符串,getData方法用于執(zhí)行Select語句返回數(shù)據(jù),runSql方法用于執(zhí)行Insert、Delete、Update等SQL語句。子類MySQL和SQLServer是DbManager針對這兩種常用數(shù)據(jù)庫的具體實現(xiàn),這使得模式可以支持多種數(shù)據(jù)庫。
基于MVC Web框架,筆者設(shè)計實現(xiàn)了程序設(shè)計實訓(xùn)Web系統(tǒng)。實訓(xùn)課程中,學(xué)生需要小組合作共同完成一個實訓(xùn)項目,一個小組提交一份電子作業(yè),教師根據(jù)小組中每個成員的工作量來評定成績。根據(jù)項目需求,系統(tǒng)核心功能確定為用戶管理、小組管理和作業(yè)管理3個主要模塊。用戶管理模塊主要提供注冊、登錄和賬號管理等功能;小組管理模塊主要提供小組的建立和刪除、小組查詢、組員加入和退出等功能;作業(yè)管理模塊中,面向教師的功能為作業(yè)發(fā)布、作業(yè)批改和成績導(dǎo)出,面向組長的功能為接收作業(yè)、分配子任務(wù)和提交作業(yè),面向組員的功能為接收子任務(wù)、提交子任務(wù)等。
上文設(shè)計的MVC Web框架提供了支撐Web系統(tǒng)的關(guān)鍵基礎(chǔ)功能,并且將系統(tǒng)邏輯結(jié)構(gòu)劃分為模式、視圖和控制器三部分,開發(fā)時只需對各部分進行必要的擴展和補充即可,這種方式極大簡化了Web系統(tǒng)的開發(fā)。
在控制器方面,針對用戶管理、小組管理和作業(yè)管理等模塊分別實現(xiàn)了UsersController、TeamsController和Projects Controller3個控制器子類。每個控制器內(nèi)部可實現(xiàn)了一系列Action(功能),如用戶管理控制器UsersController,內(nèi)部實現(xiàn)了UserRegister、UserLogin、RemoveUser、EditUser等Action。Web請求中,通過指定ct(Controller)和ac(Action)兩個參數(shù),可以調(diào)用指定控制器的指定功能,處理用戶請求。
對于每一個Action,均要設(shè)計與之匹配的專用模式子類。模式子類繼承自Model父類,提供了處理和訪問此Action所需的特定數(shù)據(jù)的能力。例如對于登錄Action和分配子任務(wù)Action,分別設(shè)計了LoginModel和SubtaskModel兩個子類,LoginModel用于處理登錄相關(guān)數(shù)據(jù),SubtaskModel用于處理子任務(wù)劃分相關(guān)數(shù)據(jù)。
另外還需為每一個Action設(shè)計對應(yīng)的視圖模板,以展示用戶界面。例如對于登錄Action和分配子任務(wù)Action,分別設(shè)計了Login.tpl和SubtaskModel.tpl兩個視圖模板。這兩個Action的用戶界面,如圖4所示。
圖4 程序設(shè)計實訓(xùn)Web系統(tǒng)部分界面(上圖為登錄界面,下圖為分配子任務(wù)界面)
MVC設(shè)計模式通過將應(yīng)用程序分離為模式-視圖-控制器3個部分,實現(xiàn)了對應(yīng)用的分層和解耦,提高了軟件設(shè)計的靈活性。分層結(jié)構(gòu)使得MVC具有耦合性低、重用性高、便于部署、易于測試等優(yōu)點。本文基于MVC模式自主設(shè)計開發(fā)了一套高效率、可擴展的輕量級Web框架,并在該框架的基礎(chǔ)上設(shè)計實現(xiàn)了程序設(shè)計實訓(xùn)Web系統(tǒng)。實踐表明,本文的MVC Web框架為Web應(yīng)用開發(fā)提供了關(guān)鍵技術(shù)支撐,簡化了開發(fā)工作,提高了開發(fā)效率,增強了應(yīng)用系統(tǒng)的穩(wěn)定性和可靠性。