認識 MVC


談及 Web 應用程式架構上的設計時,總會談到 MVC 這個名詞。MVC 是 Model、View、Controller的縮寫,這邊譯為模型、視圖、控制器,分別代表應用程式中三種職責各不相同的物件。

最原始的 MVC 模式其實是指桌面應用程式的一種設計方式,為了讓同一份資料能有不同的畫面呈現方式,並且當資料被變更時,畫面可獲得通知並根據資料更新畫面呈現。通常 MVC 模式的互動示意,會使用類似下圖的方式來表現:

認識 MVC

如果你沒有接觸過桌面應用程式設計,對於上圖的 MVC 模型最主要的是知道:

  • 模型不會有畫面相關的程式碼。
  • 視圖負責畫面相關邏輯。
  • 控制器知道某個操作必須呼叫哪些模型。

後來有人認為,MVC 這樣的職責分配,可以套用在 Web 應用程式的設計上:

  • 視圖部份可由網頁來實現。
  • 伺服器上的資料存取或商務邏輯(Business logic)由模型負責。
  • 控制器接送瀏覽器的請求,決定呼叫哪些模型來處理。

然而,桌面應用程式上的 MVC 設計方式,與 Web 應用程式有決定性的不同,Web 應用程式是基於 HTTP,必須基於請求/回應模型,沒有請求就不會有回應,也就是 HTTP 伺服器不可能在沒有請求的情況下,就主動對客戶端發出回應,也就是在上圖第 3 點,基於 HTTP 是不可能達成,因此,對 MVC 的行為作了變化,因而形成所謂 Web MVC 架構。

認識 MVC

在 Web MVC 的架構上,仍將程式職責分為模型(Model)、視圖(View)、控制器(Controller),後來 Web 應用程式躍為主流之後,也直接稱這個架構為 MVC 了,在 Web MVC 的架構上,模型、視圖、控制器各負的職責是:

  • 控制器取得請求參數、驗證請求參數、轉發請求給模型、轉發請求給畫面,這些都使用程式碼來實現。
  • 模型接受控制器的請求呼叫,負責處理商務邏輯、負責資料存取邏輯等,這部份還可依應用程式功能,產生各種不同職責的模型物件,模型使用程式碼來實現,模型的部份也可以畫面技術無關。
  • 畫面接受控制器的請求呼叫,會從模型提取運算後的結果,根據頁面邏輯呈現畫面,在職責分配良好的情況下,可做到不出現 Java 程式碼,因此不會發生程式碼與 HTML 混雜在一起的情況。

Web MVC 在 Web 應用程式中是非常重要的模式,因為職責分配清楚,有助團隊合作,許多 Web 框架都實現了 MVC,Spring MVC 就是其中之一,然而 Web MVC 的應用也不僅在 Java 技術實現的 Web 應用程式。

在可能的情況下,你應該試著於沒使用任何框架的情況下,就能實現出 MVC 的流程,這有助於你釐清應用程式流程,也有助於挑選 MVC 框架,或者有助於將一個沒有使用框架的 MVC 實現,改造為可套用該框架。

如果你從沒有過這類經驗,可以參考《Servlet & JSP 技術手冊 - 從 Servlet 到 Spring Boot》,其中的 gossip 專案,一路使用重構的方式,逐步建立了一個 MVC 架構的微網誌應用程式,最後再改造應用程式,令其可套用 Spring MVC 框架。

當你已經熟知 MVC 的設計原則,在直接運用 MVC 框架打造全新應用程式時,也能清楚地知道各個元件或設定之目的與角色,如果 Web 應用程式的設計符合 MVC 模式,那麼在使用支援 MVC 的框架時,也才能感受到框架的益處。