第1章 MVC原理
這里首先介紹經(jīng)典的MVC體系結(jié)構(gòu),通過對比MVC體系結(jié)構(gòu)和Web MVC體系結(jié)構(gòu)的區(qū)別,來深入理解Web MVC的背景、由來和特點。
1.1 MVC體系結(jié)構(gòu)
首先,我們來學習MVC的體系結(jié)構(gòu)。MVC是軟件工程中的一種軟件設計模式,也稱為前端控制器模式,它把軟件系統(tǒng)分為三個基本部分:模型,視圖和控制器,如圖1?1所示。
MVC體系結(jié)構(gòu)是一種靈活可擴展的的程序設計模式,使后續(xù)對程序的修改和擴展變得很容易,并且使程序某一部分的重復利用成為可能。除此之外,此模式通過對復雜的業(yè)務實現(xiàn)進行簡化,使程序結(jié)構(gòu)更加直觀。應用了MVC體系架構(gòu),對程序的各個基本功能進行分類,是程序的各個功能模塊之間進行解耦,各個功能獨立擁有各自的職責,顧名思義,MVC將程序分成3個層次,這包括:模型(Model)層、視圖(View)層和控制器(Controller)層。
1.1.1 控制器層
控制器層起到對不同層面間的組織作用,用于控制應用程序的流程。它處理用戶操作的事件并作出響應。響應包括更新數(shù)據(jù)模型和選擇視圖并展示數(shù)據(jù)模型。
控制器層的主要職責如下:
- 控制應用程序行為和流程
- 映射用戶動作到模型的數(shù)據(jù)變更
- 選擇相應的視圖并展示數(shù)據(jù)模型
1.1.2 視圖層
在視圖層中,一般沒有程序上的邏輯實現(xiàn),只需實現(xiàn)模型數(shù)據(jù)以一定的形式給用戶進行展示。為了實現(xiàn)視圖層的刷新功能,視圖層需要訪問后備的數(shù)據(jù)模型,視圖層訪問模型的時候,可以采用拉去數(shù)據(jù)的方式,但是這種方式的時效性并不好,因此,視圖層可以預先在模型中進行注冊,這樣模型層有狀態(tài)變更的時候,就會通知視圖層做出相應的展示上的改變。
視圖層的主要職責如下:
- 解釋數(shù)據(jù)模型,并以一定的形式展示給用戶
- 接受模型的變更通知,并改變對用戶的展示
- 發(fā)送用戶操作給控制器
1.1.3 模型層
模型層封裝與應用程序的業(yè)務邏輯相關的數(shù)據(jù)以及對數(shù)據(jù)的處理方法。模型層有對數(shù)據(jù)直接訪問的權(quán)力,例如對數(shù)據(jù)庫的訪問。模型層不依賴視圖層和控制器層,也就是說,模型層不關心它會被如何顯示或是如何被操作。但是,模型層中數(shù)據(jù)的變化一般會通過一種刷新機制響應在視圖層中。為了實現(xiàn)這種機制,那些用于監(jiān)視此模型層的視圖層必須事先在此模型上注冊,從而,視圖可以即使響應在數(shù)據(jù)模型上發(fā)生的改變,并根據(jù)此改變對用戶的展示做出變更。
模型層的主要職責如下:
- 封裝應用程序狀態(tài)
- 提供應用程序邏輯處理功能
- 進行狀態(tài)查詢和響應狀態(tài)改變
- 通知視圖數(shù)據(jù)和狀態(tài)的變更事件
本節(jié)介紹了MVC體系結(jié)構(gòu)的組件以及組件的職責,MVC的各個組件是協(xié)同工作,而又互相獨立,這樣最大程度上實現(xiàn)了組件的重用性和可擴展性。相應于Web MVC體系結(jié)構(gòu),MVC體系結(jié)構(gòu)是經(jīng)典的設計模式,主要應用在傳統(tǒng)的C/S體系架構(gòu)中。下面的小節(jié),我們介紹應用更加廣泛的Web MVC體系結(jié)構(gòu)。
1.2 Web MVC體系結(jié)構(gòu)
隨著B/S體系結(jié)構(gòu)的應用程序的流行和快速發(fā)展,MVC體系結(jié)構(gòu)思想被應用到Web應用程序設計。Web應用程序大多是基于HTTP協(xié)議的,而HTTP協(xié)議的最大特點就是無連接和無狀態(tài)的。對于一個Web的瘦客戶端程序,每次和服務器的通信都是通過一次完整的HTTP請求和響應來完成的。我們無法實現(xiàn)C/S應用程序中實現(xiàn)的在視圖層注冊監(jiān)聽器來監(jiān)聽模型層改變的通知。取而代之的是視圖每次需要主動的查詢用戶數(shù)據(jù)改變,這是MVC的一個演變,我們成為Web MVC,如圖1?2所示。
我們能看出,唯一不同的就是模型層不再通知視圖層是否發(fā)生了狀態(tài)改變,而是要求視圖層主動的去查詢模型層的變更。如果模型的數(shù)據(jù)或者狀態(tài)改變,控制器則會選擇一個新的視圖來展示模型的變更數(shù)據(jù)。通過MVC在Web應用程序的應用,使Web應用程序同樣可以有層的概念并且有較好的體系結(jié)構(gòu),易于維護和容易擴展。
1.3 本章小結(jié)
本章簡單的介紹了MVC的體系結(jié)構(gòu)和工作原理,并介紹Web MVC與經(jīng)典MVC的區(qū)別,通過對比MVC和Web MVC來深入理解Web MVC的由來和使用場景。由于MVC與Web MVC同根同源,只是應用的場景不同,本書后續(xù)不再對MVC和Web MVC進行區(qū)分。
下一章,我們將從整體架構(gòu)上分析Spring是如何實現(xiàn)Web MVC體系結(jié)構(gòu)的。