MVC架構設計淺析 楊傳偉 (石家莊鐵道大學信息科學與技術學院,河北省,石家莊市,050043) 摘 要:本文以圖書管理系統為案例(當前主流框架SpringMVC的原理來分析MVC的設計理念等),深入淺出地分析常用的WEB設計模式MVC。將從MVC的歷史、MVC每一層的作用,MVC能為我們帶來什麼好 ...
MVC架構設計淺析
楊傳偉
(石家莊鐵道大學信息科學與技術學院,河北省,石家莊市,050043)
摘 要:本文以圖書管理系統為案例(當前主流框架SpringMVC的原理來分析MVC的設計理念等),深入淺出地分析常用的WEB設計模式MVC。將從MVC的歷史、MVC每一層的作用,MVC能為我們帶來什麼好處又存在哪些問題以及MVC的前景如何等方面結合實際項目對該架構進行分析。通過本文你將從多個層面對MVC架構設計有一個初步的認識,讓你快速走近MVC設計思想,通過實際項目的剖析以及圖文交互的表達方式讓您輕鬆理解MVC架構。
關鍵詞:MVC;SpringMVC;分層;視圖;控制器;模型
0 引言
Web應用的根本都是從數據存儲和檢索數據並將其顯示給用戶。在用戶更改數據之後,系統再將更新內容存儲到數據存儲中。因為關鍵的信息流發生在數據存儲和用戶界面之間,所以很多Web應用將數據和用戶界面這兩部分綁在一起,以減少編碼量並提高應用程式性能。但是,這種看起來自然而然的方法有一些大問題。一是,用戶界面的更改往往比數據存儲系統的更改頻繁得多。二是,這種情況下耦合往往會合併其他的業務邏輯。那麼如何讓 Web 應用程式的用戶界面功能實現模塊化,以便可以輕鬆地單獨修改各個部分呢?面向對象的設計模式是Web設計經驗的總結,MVC架構可以很好地解決上述問題。
1 MVC簡介
MVC架構把數據處理,程式輸入輸出控制及數據顯示分離開來,並且描述了不同部件的對象間的通信方式。使得軟體可維護性,可擴展性,靈活性以及封裝性大大提高;MVC(Model-View-Controller)把系統的組成分解為M(模型)、V(視圖)、C(控制器)三種部件。視圖表示數據在屏幕上的顯示。控制器提供處理過程式控制制,它在模型和視圖之間起連接作用。控制器本身不輸出任何信息和做任何處理,它只負責把用戶的請求轉成針對Model的操作,和調用相應的視圖來顯示Model處理後的數據。三者之間關係如下圖1 (MVC關係圖)
圖1 MVC關係圖
2 為什麼要使用MVC
用戶界面邏輯的更改往往比業務邏輯頻繁,尤其是在基於Web的應用程式中。例如,可能添加新的用戶界面頁,或者可能完全打亂現有的頁面佈局。對顯示的更改,儘可能地不要影響到數據和業務邏輯。
目前大部分Web應用都是將數據代碼和表示混在一起。經驗比較豐富的開發者會將數據從表示層分離開來,但這通常不是很容易做到的,它需要精心的計劃和不斷的嘗試。MVC從根本上強制性的將它們分開。儘管構造MVC應用需要一些額外的工作,但它帶來的好處是毋庸置疑的。
2.1 提高代碼重用率
最重要的一點就是多個視圖可以共用同一個模型,把視圖表達和底層數據分離。不論用戶想要什麼視圖,只需要修改視圖的模式,而數據可以根據介面自由傳遞,避免了同時修改視圖和數據部分代碼的困難,提高了代碼的可重用性。
2.2 提高程式可維護性
因為模型是自包含的,並且與控制器和視圖相分離,所以很容易改變數據層和業務規則。例如,把資料庫從MySQL移植到Oracle,或者把基於RDBMS數據源改變到LDAP,只需改變模型即可。一旦正確的實現了模型,不管數據來自哪裡,視圖都會正確的顯示它們。MVC架構的運用,使得程式的三個部件相互對立,大大提高了程式的可維護性。
2.3 有利於團隊開發
在開發過程中,可以更好的分工,更好的協作。有利於開發出高質量的軟體。良好的項目架構設計,將減少編碼工作量 :採用MVC結構 + 代碼生成器,是大多數Web應用的理想選擇。部分模型(Model)、和存儲過程一般可用工具自動生成。控制(Controller)器比較穩定,一般由於架構師(也可能是有經驗的人)完成;那麼整個項目需要手動編寫代碼的地方就只有視圖(View)了。在這種模式下,個人能力不在特別重要,只要懂點語法基礎的人都可以編寫,無論項目成員寫出什麼樣的代碼,都在項目管理者的可控範圍內。即使項目中途換人,也不會有太大問題。在個人能力參差不齊的團隊開發中,採用MVC開發是非常理想的。
3 基於SpringMVC的案例分析
系統採用了SpringBoot框架,而SpringBoot是對SpringMVC的擴展,本質上依然是MVC架構模式,下麵將以此為例帶你瞭解MVC的原理和實現過程。
3.1 MVC的工作流程
SpringMVC 是一種基於 Java 的實現 MVC 設計模型的請求驅動類型的輕量級 Web 框架屬於SpringFrameWork的後續產品,已經融合在 Spring Web Flow 中。
MVC的工作流程: 用戶通過視圖層發送請求到伺服器,在伺服器中請求被Controller接收,Controller調用相應的Model層處理請求,處理完畢將結果返回到Controller,Controller再根據請求處理的結果找到相應的View視圖,渲染數據後最終響應給瀏覽器。
3.2 SpringMVC實現原理
先看一張原理圖(圖2 SpringMVC原理圖)首先用戶發起請求,請求被DispatcherServlet攔截,攔截之後去尋找請求對應的映射器。DispatcherServlet是核心,一切的一切都是從攔截請求開始的,當請求被攔截時,SpringMVC會根據請求,去處理請求映射關係,從而找到該請求對應的控制器,把處理器的名字返回到DispatcherServlet,而後再由DispatcherServlet找到該控制器,控制器完成的工作主要是封裝數據,返回用戶需要的視圖,視圖返回後,由DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。(獲得model and view 中的數據,解析視圖名字,拼接視圖路徑)視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。
圖2 SpringMVC原理圖
3.3 MVC項目目錄結構
在基於SpringMVC的圖書管理系統中,該框架在文件目錄上把MVC清晰地分為了三層目錄結構,分別對應了數據模型層(完成控制層和資料庫的交互,完全不用干涉視圖層),控制層(通過控制器決定了視圖層的用戶需要得到什麼數據,成為視圖層和數據模型層的橋梁),視圖層(專註於如何把控制層傳來的數據更好的展示給用戶),目錄結構如下圖3。
圖3 SpringMVC目錄結構圖
3.4 MVC核心
SpringMVC乃至整個MVC架構的核心在控制層,控制層起到了承上啟下,交互的作用。控制層決定了什麼樣的數據要傳給什麼樣的視圖,下麵介紹一下SpringMVC是如何實現控制層的。
為了方便管理,控制層被進一步分解出服務層(Service)這一層主要負責數據的獲取,Controller層只需要去調用Servie層獲取數據,而不需要既關註數據又關註視圖。結構如圖4所示:
圖4 SpringMVC Controller層結構圖
4 MVC的優點和不足
4.1 MVC的優點
MVC的優點體現在以下幾個方面:
(1) 有利於團隊開發分工協作和質量控制,降低開發成本。
(2) 可以為一個模型在運行時同時建立和使用多個視圖。變化-傳播機制可以確保所有相關的視圖及時得到模型數據變化,從而使所有關聯的視圖和控制器做到行為同步。
(3) 視圖與控制器的可接插性,允許更換視圖和控制器對象,而且可以根據需求動態的打開或關閉、甚至在運行期間進行對象替換。
(4) 模型的可移植性。因為模型是獨立於視圖的,所以可以把一個模型獨立地移植到新的平臺工作。需要做的只是在新平臺上對視圖和控制器進行新的修改。
(5) 潛在的框架結構。可以基於此模型建立應用程式框架,不僅僅是用在設計界面的設計中。
4.2 MVC的不足
MVC的不足體現在以下幾個方面:
(1)增加了系統結構和實現的複雜性。對於簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增加結構的複雜性,並可能產生過多的更新操作,降低運行效率。
(2)視圖對模型數據的訪問效率低。視圖可能需要多次調用Model才能獲得足夠的顯示數據。
(3)完全理解MVC並不是很容易。使用MVC需要精心的計劃,由於它的內部原理比較複雜,所以需要花費一些時間去思考。 同時由於模型和視圖要嚴格的分離,這樣也給調試應用程式到來了一定的困難。
參考文獻:
[1] SSM(Spring-MyBatis-SpringMVC)框架整合【完整版】
https://www.cnblogs.com/rainbow-1/p/15616020.html
[2] SpringMVC執行原理
https://www.cnblogs.com/rainbow-1/p/15610933.html
[3] MVC架構在Asp.net中的應用和實現
https://www.cnblogs.com/yanyao/articles/4836583.html
有摘錄、非原創、侵聯刪。
好看請贊,養成習慣!
本文來自博客園,作者:靠譜楊,轉載請註明原文鏈接:https://www.cnblogs.com/rainbow-1/p/16291430.html