MVC架構設計淺析

来源:https://www.cnblogs.com/rainbow-1/archive/2022/05/20/16291430.html
-Advertisement-
Play Games

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 堆積了兩天一起發的,先祝大家節日快樂 後面任務很繁重,還有登錄註冊組件還有後臺管理頁面,真的繁重,我現在感覺每天全天時間都在學都不一定學得完,主要想在六月一號之前把整個項目過一遍。看看能不能創造奇跡 一.防抖和節流 拋出一個問題,就是我們的三級聯動,正常情況你慢慢的去滑動是沒有bug的,但是當你快速 ...
  • 一、引言 繼上次實現文件上傳功能後,產品經理又提出了新的需求:上傳圖片預覽及進度條效果。本次就來搞定這個功能,這次開發基於上次的隨筆,需要的小伙伴們自取 -- 如何使用Ajax實現簡單的文件上傳。 二、瞭解原理 要想實現文件預覽效果,這裡使用的是 FileReader 對象。使用它的 readAsD ...
  • /* 下述代碼近供參考 水仙花數是指一個3位數,它的每個位上的數字3次冪之和等於它本身。 例如:(1的3次方+5的3次方+3的3次方=153),請列印所有的水仙花數。 */ // 第一種方式 for(var a=0;a<10;a++) { for(var b=0;b<10;b++) { for( v ...
  • in操作符作用: 遍歷類型 基本用法 type roles = "tester" | "developer" | "manager"; const staffCount: { [k in roles]: number } = { tester: 100, developer: 200, manage ...
  • 索引:對象或數組的對應位置的名字 數組的索引就是 number 類型的 0,1,2,3... 對象的索引就是 string 類型的屬性名 數字索引簽名:通過定義介面用來約束數組 type numberIndex{ [index:number]:string } const testArray:num ...
  • DRY原則 DRY 原則,它的英文描述為:Don’t Repeat Yourself。中文直譯為:不要重覆自己。也可以理解為:不要寫重覆的代碼。 我們從實現邏輯重覆、功能語義重覆和代碼執行重覆,這三種代碼重覆來說明DRY原則。 實現邏輯重覆 例如有兩個函數isValidUserName() 和 is ...
  • 從演化歷史看大型網站架構 楊傳偉 (石家莊鐵道大學信息科學與技術學院,河北省,石家莊市,050043) 摘 要:本文以大型網站系統的特點、大型網站架構演化發展歷程以及大數據與高併發為切入和論述點,由淺入深、由簡到繁地對大型網站架構設計展開敘述,首先通述其特點,之後介紹大型網站架構的歷史發展歷程,從其 ...
  • 一些必須提前知道的概念 patition kafka日誌文件是以patition在物理存儲上分割的 是topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的隊列 是以文件夾的形式存儲在具體Broker本機上 LEO 表示每個partition的log ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文將以 C# 語言來實現一個簡單的布隆過濾器,為簡化說明,設計得很簡單,僅供學習使用。 感謝@時總百忙之中的指導。 布隆過濾器簡介 布隆過濾器(Bloom filter)是一種特殊的 Hash Table,能夠以較小的存儲空間較快地判斷出數據是否存在。常用於允許一定誤判率的數據過濾及防止緩存 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 「簡單有價值的事情長期堅持做」 這是成功最簡單,但也最難學的秘訣。不經過訓練,人很難意識到時間複利的威力。 仙劍奇俠傳的「十里坡劍神」和金庸群俠傳的「十級野球拳」,就是簡單的事情持之以恆反覆做,最後就有巨大的威力 唐家三少成為網文收入第一,最重要的一步是十四年從未斷日更 這樣的案例很多,一開始可能成 ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“我愛加班”。 面試開始,直入正題。 面試官: 看你簡歷上面寫著精通MySQL,我先問你事務的特性是什麼? 老生常談,這個還有誰不會背的嗎? 我: ...
  • 基礎知識 python是一門腳本語言,它是解釋執行的。 python使用縮進做為語法,而且python2環境下同一個py文件中不能同時存在tab和空格縮進,否則會出錯,建議在IDE中顯示縮進符。 python在聲明變數時不寫數據類型,可以type(xx)來獲取欄位的類型,然後可以int(),list ...
  • 為什麼要多線程下載 俗話說要以終為始,那麼我們首先要明確多線程下載的目標是什麼,不外乎是為了更快的下載文件。那麼問題來了,多線程下載文件相比於單線程是不是更快? 對於這個問題可以看下圖。 橫坐標是線程數,縱坐標是使用對應線程數下載對應文件時花費的時間,藍橙綠代表下載文件的大小,每個線程下載對應文件2 ...
  • 詳細講解python爬蟲代碼,爬微博搜索結果的博文數據。 爬取欄位: 頁碼、微博id、微博bid、微博作者、發佈時間、微博內容、轉發數、評論數、點贊數。 爬蟲技術: 1、requests 發送請求 2、datetime 時間格式轉換 3、jsonpath 快速解析json數據 4、re 正則表達式提... ...
  • 背景: 一般我們可以用HashMap做本地緩存,但是HashMap功能比較弱,不支持Key過期,不支持數據範圍查找等。故在此實現了一個簡易的本地緩存,取名叫fastmap。 功能: 1.支持數據過期 2.支持等值查找 3.支持範圍查找 4.支持key排序 實現思路: 1.等值查找採用HashMap2 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 本章是系列文章的第八章,用著色演算法進行寄存器的分配過程。 本文中的所有內容來自學習DCC888的學習筆記或者自己理解的整理,如需轉載請註明出處。周榮華@燧原科技 寄存器分配 寄存器分配是為程式處理的值找到存儲位置的問題 這些值可以存放到寄存器,也可以存放在記憶體中 寄存器更快,但數量有限 記憶體很多,但 ...