MVC模式
MVC模式是"Model-View-Controller"的縮寫,中文翻譯為"模式-視圖-控制器"。MVC應用程式總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,只要Controller改變了View,View會從潛在的Model中擷取資料來重新整理自己。MVC模式最早是smalltalk語言研究團提出的,應用於使用者互動應用程式中。smalltalk語言和java語言有很多相似性,都是物件導向語言,很自然的SUN在petstore(寵物店)案例應用程式中就推薦MVC模式作為開發Web應用的架構模式。MVC模式是一種架構模式,其實需要其他模式協作完成。在J2EE模式目錄中,通常採用service to worker模式實現,而service to worker模式可由集中控制器模式,派遣器模式和Page Helper模式組成。而Struts只實現了MVC的View和Controller兩個部分,Model部分需要開發人員自己來實現,Struts提供了抽象類別Action使開發人員能將Model應用於Struts架構中。 MVC模式是一個複雜的架構模式,其實現也顯得非常複雜。但是,我們已經終結出了很多可靠的設計模式,多種設計模式結合在一起,使MVC模式的實現變得相對簡單易行。Views可以看作一棵樹,顯然可以用Composite Pattern來實現。Views和Models之間的關係可以用Observer Pattern體現。Controller控制Views的顯示,可以用Strategy Pattern實現。Model通常是一個調停者,可採用Mediator Pattern來實現。
現在讓我們來瞭解一下MVC三個部分在J2EE架構中處於什麼位置,這樣有助於我們理解MVC模式的實現。MVC與J2EE架構的對應關係是:View處於Web Tier或者說是Client Tier,通常是JSP/Servlet,即頁面顯示部分。Controller也處於Web Tier,通常用Servlet來實現,即頁面顯示的邏輯部分實現。Model處於Middle Tier,通常用服務端的javaBean或者EJB實現,即商務邏輯部分的實現。
一、MVC設計思想
MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出資料流程按照Model、View、Controller的方式進行分離,這樣一個應用被分成三個層——模型層、視圖層、控制層。
視圖(View)代表使用者互動介面,對於Web應用來說,可以概括為HTML介面,但有可能為XHTML、XML和Applet。隨著應用的複雜性和規模性,介面的處理也變得具有挑戰性。一個應用可能有很多不同的視圖,MVC設計模式對於視圖的處理僅限於視圖上資料的採集和處理,以及使用者的請求,而不包括在視圖上的商務程序的處理。商務程序的處理交予模型(Model)處理。比如一個訂單的視圖只接受來自模型的資料並顯示給使用者,以及將使用者介面的輸入資料和請求傳遞給控制和模型。
模型(Model):就是商務程序/狀態的處理以及商務規則的制定。商務程序的處理過程對其它層來說是黑箱操作,模型接受視圖請求的資料,並返回最終的處理結果。業務模型的設計可以說是MVC最主要的核心。目前流行的EJB模型就是一個典型的應用例子,它從應用技術實現的角度對模型做了進一步的劃分,以便充分利用現有的組件,但它不能作為應用設計模型的架構。它僅僅告訴你按這種模型設計就可以利用某些技術組件,從而減少了技術上的困難。對一個開發人員來說,就可以專註於業務模型的設計。MVC設計模式告訴我們,把應用的模型按一定的規則抽取出來,抽取的層次很重要,這也是判斷開發人員是否優秀的設計依據。抽象與具體不能隔得太遠,也不能太近。MVC並沒有提供模型的設計方法,而只告訴你應該組織管理這些模型,以便於模型的重構和提高重用性。我們可以用對象編程來做比喻,MVC定義了一個頂級類,告訴它的子類你只能做這些,但沒法限制你能做這些。這點對編程的開發人員非常重要。
業務模型還有一個很重要的模型那就是資料模型。資料模型主要指實體物件的資料 儲存(持續化)。比如將一張訂單儲存到資料庫,從資料庫擷取訂單。我們可以將這個模型單獨列出,所有有關資料庫的操作只限制在該模型中。
控制(Controller)可以理解為從使用者接收請求, 將模型與視圖匹配在一起,共同完成使用者的請求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個分發器,選擇什麼樣的模型,選擇什麼樣的視圖,可以完成什麼樣的使用者請求。控制層並不做任何的資料處理。例如,使用者點擊一個串連,控制層接受請求後, 並不處理商務資訊,它只把使用者的資訊傳遞給模型,告訴模型做什麼,選擇符合要求的視圖返回給使用者。因此,一個模型可能對應多個視圖,一個視圖可能對應多個模型。
模型、視圖與控制器的分離,使得一個模型可以具有多個顯示視圖。如果使用者通過某個視圖的控制器改變了模型的資料,所有其它依賴於這些資料的視圖都應反映到這些變化。因此,無論何時發生了何種資料變化,控制器都會將變化通知所有的視圖,導致顯示的更新。這實際上是一種模型的變化-傳播機制。模型、視圖、控制器三者之間的關係和各自的主要功能,1所示。
二、MVC設計模式的實現
ASP.NET提供了一個很好的實現這種經典設計模式的類似環境。開發人員通過在ASPX頁面中開發使用者介面來實現視圖;控制器的功能在邏輯功能代碼(.cs)中實現;模型通常對應應用系統的業務部分。在ASP.NET中實現這種設計而提供的一個多層系統,較經典的ASP結構實現的系統來說有明顯的優點。將使用者顯示(視圖)從動作(控制器)中分離出來,提高了代碼的重用性。將資料(模型)從對其操作的動作(控制器)分離出來可以讓你設計一個與後台儲存資料無關的系統。就MVC結構的本質而言,它是一種解決耦合系統問題的方法。
2.1 視圖
視圖是模型的表示,它提供使用者互動介面。使用多個包含單顯示頁面的使用者組件,複雜的Web頁面可以展示來自多個資料來源的內容,並且網頁人員,美工能獨自參與這些Web頁面的開發和維護。
在ASP.NET下,視圖的實現很簡單。可以像開發WINDOWS介面一樣直接在整合式開發環境下通過拖動控制項來完成頁面開發本。本文中介紹每一個頁面都採用複合視圖的形式即:一個頁面由多個子視圖(使用者組件)組成;子視圖可以是最簡單HTML 控制項、伺服器控制項或多個控制項嵌套構而成的Web自訂控制項。頁面都由模板定義,模板定義了頁面的布局,使用者組件的標籤和數目,使用者指定一個模板,平台根據這些資訊自動建立頁面。針對靜態模板內容,如頁面上的網站導覽,菜單,友好連結,這些使用預設的模板內容配置;針對動態模板內容(主要是業務內容),由於使用者的請求不同,只能使用後期綁定,並且針對使用者的不同,使用者組件的顯示內容進行過濾。使用由使用者組件根據模板配置組成的組合頁面,它增強了可重用性,並原型化了網站的布局。
視圖部分大致處理流程如下:首先,頁面模板定義了頁面的布局;頁面設定檔定義視表徵圖簽的具體內容(使用者組件);然後,由頁面配置策略類初始化並載入頁面;每個使用者組件根據它自己的配置進行初始化,載入校正器並設定參數,以及事件的委託等;使用者提交後,通過了展示層的校正,使用者組件把資料自動認可給業務實體即模型。
這一部分主要定義了WEB頁面基類PageBase;頁面配置策略類PageLayout,完成頁面配置,用於載入使用者組件到頁面;使用者組件基類UserControlBase即使用者組件架構,用於動態載入檢驗組件,以及實現使用者組件的個人化。為了實現WEB應用的靈活性,視圖部分也用到了許多設定檔例如:置檔案有模板配置、頁面配置、路徑配置、驗證配置等。
2.2 控制器
為了能夠控制和協調每個使用者跨越多個請求的處理,控制機制應該以集中的方式進行管理。因此,為了達到集中管理的目的引入了控制器。應用程式的控制器集中從用戶端接收請求(典型情況下是一個運行瀏覽器的使用者),決定執行什麼商業邏輯功能,然後將產生下一步使用者介面的責任委派給一個適當的視圖組件。
用控制器提供一個控制和處理請求的集中進入點,它負責接收、截取並處理使用者請求;並將請求委託給分發者類,根據目前狀態和業務操作的結果決定向客戶呈現的視圖。在這一部分主要定義了HttpReqDispatcher(分發者類)、HttpCapture(請求捕獲者類)、Controller(控制器類)等,它們相互配合來完成控制器的功能。請求捕獲者類捕獲HTTP請求並轉寄給控制器類。控制器類是系統中處理所有請求的最初進入點。控制器完成一些必要的處理後把請求委託給分發者類;分發者類分發者負責視圖的管理和導航,它管理將選擇哪個視圖提供給使用者,並提供給分發資源控制。在這一部分分別採用了分發者、策略、Factory 方法、適配器等設計模式。
為了使請求捕獲者類自動捕獲使用者請求並進行處理,ASP.NET 提供低層級的請求/響應 API,使開發人員能夠使用 .NET 架構類為傳入的 HTTP 要求提供服務。為此,必須創作支援 System.Web.IHTTPHandler 介面和實現 ProcessRequest() 方法的類即:請求捕獲者類,並在web.config 的 <httphandlers> 節中添加類。ASP.NET 收到的每個傳入 HTTP 要求最終由實現 IHTTPHandler 的類的特定執行個體來處理。IHttpHandlerFactory 提供了處理 IHttpHandler 執行個體 URL 請求的實際解析的結構。HTTP 處理常式和工廠在 ASP.NET 配置中聲明為 web.config 檔案的一部分。ASP.NET 定義了一個 <httphandlers> 配置節,在其中可以添加和移除處理常式和工廠。子目錄繼承 HttpHandlerFactory 和 HttpHandler 的設定。 HTTP 處理常式和工廠是 ASP.NET 頁架構的主體。工廠將每個請求分配給一個處理常式,後者處理該請求。 例如,在全域 machine.config 檔案中,ASP.NET 將所有對 ASPx 檔案的請求映射到 HttpCapture類:
<httphandlers>
...
...
</httphandlers>
2.3 模型
MVC系統中的模型從概念上可以分為兩類
http://www.bkjia.com/PHPjc/632486.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632486.htmlTechArticleMVC模式 MVC模式 是Model-View-Controller的縮寫,中文翻譯為 模式 - 視圖 -控制器。 MVC 應用 程式 總是由這三個部分組成。Event(事件)導致Controll...