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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...