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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...