亓雪冬, 韓立峰
(中國石油大學(華東)信息化建設處, 山東 青島 266580)
隨著Web業務需求的不斷增長,MVC設計模式和基于MVC的Web框架被持續研究和關注,如冉啟武等[1]設計了基于MVC模式的教學管理電子信息系統;張翠翠等[2]研究了基于MVC的試卷生成及主觀題判卷算法;王俊芳等[3]研究和應用了基于MVC模式的ThinkPHP框架;Majida Laaziri等[4]評估了Laravel、Smfony和CodeIgniter三種PHP Web框架并對其性能進行了測試;Andri Sunardi等[5]對比了Laravel和Slim兩種PHP Web框架并研究了在自由職業者項目監控系統中的應用效果。眾多研究表明,MVC模式通過對應用的分層和解耦,減少了架構設計的復雜性,增加了代碼的靈活性和可重用性;而MVC Web框架通過提供基礎框架模型和類庫,減少了Web應用開發中的重復代碼,提高了開發效率和可維護性。
本文在研究MVC設計模式的基礎上,分析了Web應用的一般性需求,提出了MVC Web框架的設計思路,并基于該框架設計實現了程序設計實訓Web系統。
MVC設計模式最初于上世紀80年代誕生于Smalltalk語言中,近年來被廣泛應用于Java EE、Web等平臺的軟件開發中。MVC全稱為Model-View-Controller,Model指數據模型,View指視圖(用戶界面),而Controller則指控制器。MVC的目的是將Model和View分離,從而使同一個程序可以使用不同的表現形式。MVC強制使應用程序的輸入、處理和輸出分開設計,將程序主體分離為模型、視圖、控制器3個核心部件,實現功能的解耦。模型-視圖-控制器三者間的關系,如圖1所示。

圖1 MVC架構示意圖
控制器接受用戶的輸入并調用模型和視圖去完成用戶的需求,它本身不做任何處理,也不輸出任何數據。單擊Web頁面中的超鏈接和發送HTML表單時,它只是接收請求并決定調用哪個模型去處理請求,然后再確定用哪個視圖來顯示返回的數據,相當于模型和視圖的粘合邏輯。
模型表示數據和業務規則,它返回的數據是中立的,與數據格式無關,因此一個模型能夠為多個視圖提供數據,減少了代碼的重復性。
視圖為用戶提供一種展示和操作數據的方式。不同的視圖代表多個不同的用戶界面。實際的處理操作發生在模型部分而不是視圖部分。在Web應用程序,視圖通常由HTML元素、模板標記語言以及模型返回的數據共同組成。
本文設計的Web框架遵循MVC設計模式,核心類包括控制器基類Controller、模式基類Model、用于生成視圖的模板類Template和工具類Request。整體架構,如圖2所示。

圖2 整體架構設計圖
控制器基類Controller邏輯上依賴于類Model和類Template,內部包含了Model和Template的實例,其目的是粘合這兩個類的功能,選擇合適的Model獲取數據,并選擇合適的模板生成視圖。模式基類Model包含了操縱數據的基本業務邏輯,如查找、保存、更新和刪除數據等方法。模板類Template內部封裝了第三方的模板引擎Smarty,實現內存數據到HTML格式視圖的轉換。工具類Request實現了Web請求數據的封裝、請求的派發等功能,將Web請求轉發到指定的控制器。
該架構將Controller與Model的業務邏輯層作為應用的主要開發區域,上層應用程序只需繼承Controller和Model,根據業務實際需求實現對應子類UserControl和UserModel,即可完成業務邏輯開發。
index.php為Web請求的入口地址。Web請求到達后,index.php首先將Web請求中攜帶的各種數據進行封裝以便后續使用;接下來將Web請求派發到指定控制器,由控制器完成對請求的后續處理。

Requset:: dispatch()方法實現了控制器調度,其思路為:
(1) 從Web請求的Get數據中提取ct和ac兩個參數的值,這兩個參數表示執行處理的控制器Controller以及控制器的具體操作Action;
(2) 將預設的控制器文件目錄、上一步操作中提取的控制器名稱以及字符串“.php”三部分合成控制器類文件完整路徑,使用require語句包含該控制器類;
(3) 創建該控制器的實例,并調用實例中參數ac所指的Action方法,完成控制器調度。
控制器設計包含兩個層次,Controller基類和UserController子類。基類中包含Model和Template的實例,方便粘合模式和視圖。但基類中并未實現任何Action方法,這部分留給子類根據業務邏輯具體實現。
控制器完成業務邏輯后,將調用模板類Template,將返回的數據和指定的模板合成視圖,向用戶展示Web應用界面。Template類基于第三方的模板引擎Smarty,模板文件使用Smarty的語法,擴展名為tpl。Template類公開了assign和display兩個方法,assign將控制器返回的數據替換入模板,display根據模板語言對模板進行解釋,生成最終的視圖。
模式的設計圍繞操縱和處理數據展開。在業務系統中,數據表現為關系數據庫中的關系(表);然而在軟件設計中,數據表現為內存中的對象。為了實現關系與內存對象之間的數據轉換,本文在模式層設計了輕量級、可擴展的對象-關系映射(Object/Relation Mapping,簡稱ORM)機制,相關設計類,如圖3所示。

圖3 模式部分類圖
DbManager是直接操縱數據庫的抽象基類,connect屬性表示數據庫連接對象,config屬性表示數據庫配置字符串,getData方法用于執行Select語句返回數據,runSql方法用于執行Insert、Delete、Update等SQL語句。子類MySQL和SQLServer是DbManager針對這兩種常用數據庫的具體實現,這使得模式可以支持多種數據庫。

基于MVC Web框架,筆者設計實現了程序設計實訓Web系統。實訓課程中,學生需要小組合作共同完成一個實訓項目,一個小組提交一份電子作業,教師根據小組中每個成員的工作量來評定成績。根據項目需求,系統核心功能確定為用戶管理、小組管理和作業管理3個主要模塊。用戶管理模塊主要提供注冊、登錄和賬號管理等功能;小組管理模塊主要提供小組的建立和刪除、小組查詢、組員加入和退出等功能;作業管理模塊中,面向教師的功能為作業發布、作業批改和成績導出,面向組長的功能為接收作業、分配子任務和提交作業,面向組員的功能為接收子任務、提交子任務等。
上文設計的MVC Web框架提供了支撐Web系統的關鍵基礎功能,并且將系統邏輯結構劃分為模式、視圖和控制器三部分,開發時只需對各部分進行必要的擴展和補充即可,這種方式極大簡化了Web系統的開發。
在控制器方面,針對用戶管理、小組管理和作業管理等模塊分別實現了UsersController、TeamsController和Projects Controller3個控制器子類。每個控制器內部可實現了一系列Action(功能),如用戶管理控制器UsersController,內部實現了UserRegister、UserLogin、RemoveUser、EditUser等Action。Web請求中,通過指定ct(Controller)和ac(Action)兩個參數,可以調用指定控制器的指定功能,處理用戶請求。
對于每一個Action,均要設計與之匹配的專用模式子類。模式子類繼承自Model父類,提供了處理和訪問此Action所需的特定數據的能力。例如對于登錄Action和分配子任務Action,分別設計了LoginModel和SubtaskModel兩個子類,LoginModel用于處理登錄相關數據,SubtaskModel用于處理子任務劃分相關數據。
另外還需為每一個Action設計對應的視圖模板,以展示用戶界面。例如對于登錄Action和分配子任務Action,分別設計了Login.tpl和SubtaskModel.tpl兩個視圖模板。這兩個Action的用戶界面,如圖4所示。

圖4 程序設計實訓Web系統部分界面(上圖為登錄界面,下圖為分配子任務界面)
MVC設計模式通過將應用程序分離為模式-視圖-控制器3個部分,實現了對應用的分層和解耦,提高了軟件設計的靈活性。分層結構使得MVC具有耦合性低、重用性高、便于部署、易于測試等優點。本文基于MVC模式自主設計開發了一套高效率、可擴展的輕量級Web框架,并在該框架的基礎上設計實現了程序設計實訓Web系統。實踐表明,本文的MVC Web框架為Web應用開發提供了關鍵技術支撐,簡化了開發工作,提高了開發效率,增強了應用系統的穩定性和可靠性。