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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...