MVC及其衍生

MVC

把軟件分成模型(Model)、視圖(View)、控制器(Controller)三個基本部分。
事實上對應著
Controller——輸入
用戶交互,將輸入處理成Controller能處理的形式

Model——處理
描述狀態、邏輯規律、運算方法、存儲

View——輸出
當數據經過模型處理發生變化,View通過Controller進行更新。

存在的問題

雖然劃分了MVC,三者之間的關系事實上是相互依賴的,實際上并不分割,三者仍需要整體設計。介紹之前學習一個23種之外,但同樣非常重要的MVC模式。

MVC衍生模式

ADR——MVC思想向WEB應用的轉化
HMVC——為了單獨處理網頁的小區域,掛彈窗廣告的
MVP——解決自動化單元測試,進行模型和視圖的單獨測試
MVVM——通過GUI直接操作領域模型,弱化控制器功能,側重模型和視圖
MVA——為領域模型增加不同的前端界面,WEB、APP、小程序等

后續發展

經典的 MVC 模式

MVC(Model-View-Controller)是一種表現層的設計模式,主要目的是將用戶界面(UI)的邏輯與業務邏輯分離。

Model (模型):代表應用程序的數據和業務規則。它負責數據的存取、驗證和業務處理。

View (視圖):用戶看到的界面,負責展示數據(從Model獲取)和接收用戶輸入。它不包含業務邏輯。

Controller (控制器):接收用戶的請求,調用Model進行處理,并根據結果選擇相應的View返回給用戶。它是Model和View之間的協調者。

在早期Java Web開發(如Servlet/JSP時代)中的實現:

View:JSP 頁面,主要負責顯示。

Controller:Servlet,接收HTTP請求,處理參數。

Model:JavaBean(POJO),或者直接在Servlet中調用JDBC進行數據庫操作。

存在的問題:

職責不清:Servlet(Controller)往往承擔了太多工作,如參數解析、業務邏輯調用、數據庫操作(DAO)、數據校驗、選擇視圖等,容易變成“上帝類”(God Class),非常臃腫。

高度耦合:業務邏輯、數據訪問邏輯和表現層邏輯混雜在一起,任何一方的修改都可能影響其他部分,難以測試和維護。

復用性差:業務邏輯被寫在Servlet中,無法在其他地方復用。

三層架構(3-Tier Architecture)

為了解決MVC模式中Controller過于臃腫的問題,開發者將應用在縱向(邏輯上)劃分為三個明確的層次,每個層次職責單一。這是一種更宏觀的、涵蓋整個應用的架構模式。

表現層 (Presentation Layer / Web Layer)

職責:處理用戶交互,接收請求,渲染響應。

對應MVC:包含了MVC中的 Controller 和 View。

技術實現:Spring MVC 中的 @Controller, @RestController, JSP, Thymeleaf 等。

業務邏輯層 (Business Logic Layer / Service Layer)

職責:包含應用程序的核心業務邏輯。它協調多個數據訪問操作,處理事務、權限、日志等跨領域關注點。

技術實現:Spring 的 @Service 組件。

數據訪問層 (Data Access Layer / Persistence Layer)

職責:負責與數據庫進行交互,執行CRUD(增刪改查)操作。

技術實現:DAO (Data Access Object) 模式,Spring 的 @Repository 組件,通常使用 JPA、MyBatis、Hibernate 等ORM框架。

與MVC的關系:
你可以將三層架構理解為對MVC中“Model”部分的細化。原本臃腫的Model被拆解為了Service層和DAO層,而MVC中的 C和V 則共同構成了三層架構中的表現層。

MVC 組件 在三層架構中的對應部分
Controller 表現層的一部分
View 表現層的一部分
Model 被拆分為 業務邏輯層 和 數據訪問層
此時的架構圖:

text
用戶請求 -> [表現層 (Controller/View)] -> [業務邏輯層 (Service)] -> [數據訪問層 (DAO/Repository)] -> 數據庫
響應 <- <-

Spring Framework

Spring 框架的出現極大地促進和規范了三層架構的實現。

IoC (控制反轉) / DI (依賴注入):這是最核心的貢獻。Spring 容器負責創建和管理各層對象(Bean),并自動將它們注入到需要的地方(如將 Repository 注入到 Service,將 Service 注入到 Controller)。這徹底解決了層與層之間的硬編碼耦合問題,使得各層可以獨立開發、測試和替換。

聲明式事務管理:通過在Service層使用 @Transactional 注解,可以將復雜的事務管理從業務代碼中剝離,由Spring代理實現,大大簡化了開發。

AOP (面向切面編程):允許將像日志、安全、事務這樣的橫切關注點模塊化,然后透明地應用到業務邏輯中,使得業務代碼更加純凈和專注。

豐富的集成支持:Spring 對各類ORM框架(Hibernate, JPA, MyBatis)、Web框架(Spring MVC)提供了無縫集成,讓開發者可以專注于各層的業務實現,而不是技術整合。

總結:Spring框架為三層架構提供了成熟的、標準化的實現手段和解耦工具。

Spring Boot

Spring Boot 并不是一個新的架構,它是對基于Spring的三層架構開發的進一步簡化和完善,主打“約定大于配置”。

自動化配置 (Auto-Configuration):

Spring Boot 根據項目依賴(如classpath下是否有MySQL驅動、Spring Data JPA等)自動配置應用程序所需的Bean和基礎設施。

這避免了在傳統Spring項目中編寫大量繁瑣的XML或Java配置,讓開發者幾乎可以“開箱即用”。

嵌入式Web服務器:

內置Tomcat、Jetty等服務器,可以將應用打包成一個獨立的、可執行的JAR文件,無需部署到外部Web容器。這簡化了部署和運維。

Starter依賴:

提供一系列“啟動器”(如 spring-boot-starter-web, spring-boot-starter-data-jpa),通過一個依賴就能引入整個功能模塊所需的所有jar包,避免了依賴地獄。

Actuator:

提供生產級特性,如監控應用健康狀態、指標收集等,使得三層架構的應用不僅易于開發,還易于運維。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98810.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微碩WINSOK MOS管WSF3089,賦能汽車轉向系統安全升級

隨著汽車電子化程度不斷提高&#xff0c;轉向系統對高效功率器件的需求日益增長。微碩WINSOK推出的N溝道Trench MOS管WSF3089&#xff0c;以30 V/72 A大電流、4.5 mΩ超低導通電阻和TO-252-2L緊湊封裝&#xff0c;為EPS&#xff08;電動助力轉向&#xff09;電機驅動、電源管理…

淘寶拍立淘接口的接入與應用||item_search_img-按圖搜索淘寶商品(拍立淘)

淘寶拍立淘接口的接入與應用如下&#xff1a;接入流程注冊與認證&#xff1a;開發者賬號注冊&#xff1a;訪問淘寶開放平臺&#xff0c;進行開發者賬號注冊。創建應用&#xff1a;在控制臺創建新應用&#xff0c;獲取 App Key 和 App Secret&#xff0c;這是接口調用的憑證。申…

Python學習-day8 元組tuple

元組&#xff08;Tuple&#xff09;是Python中一種不可變的序列類型&#xff0c;用于存儲多個有序元素。與列表&#xff08;List&#xff09;類似&#xff0c;但元組一旦創建后不能修改&#xff08;不可添加、刪除或修改元素&#xff09;&#xff0c;這使得它在安全性、性能優化…

大數據畢業設計選題推薦-基于大數據的國家醫用消耗選品采集數據可視化分析系統-Hadoop-Spark-數據可視化-BigData

?作者主頁&#xff1a;IT畢設夢工廠? 個人簡介&#xff1a;曾從事計算機專業培訓教學&#xff0c;擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

二次學習C語言補充2

文章目錄表棧、隊列、二叉樹一、二叉樹二、表棧三、隊列鏈表一、單向鏈表二、循環鏈表、雙向鏈表和雙向循環鏈表預處理一、預處理二、宏定義文件文件操作補充本篇文章是對二次學習C語言12——文件操作 二次學習C語言14——預處理及模塊化 二次學習C語言15——鏈表 二次學習C語言…

2.9Vue創建項目(組件)的補充

1.再創建和引入vue的選擇2.VsCode插件 安裝Vue自己搜索最新的3.style自己的作用域在一個組件中引入另一個文件的子組件&#xff0c;給當前組件設置樣式&#xff0c;那么子組件的樣式也會改變的。為了解決這個問題 我們在自己的style中設置一個屬性4.另一種創建vue 的方式(主流…

算法高頻題

刷題&#xff1a;LeetCode&#xff08;Top 100-150題&#xff0c;至少刷兩遍&#xff09;。重點&#xff1a;鏈表、樹、二分查找、動態規劃、回溯、棧/隊列。 每一個題型&#xff0c;前10個高頻題 算法思考框架參考&#xff1a;算法題思維框架-CSDN博客 高頻順序參考網站&…

服務器安裝 LDOPE(MODIS 數據處理工具)

目錄下載方式1-&#xff08;簡單快捷&#xff09;根據WRF-VPRM 需要打補丁下載方式2&#xff1a;&#xff08;手動安裝依賴&#xff09;一、安裝所需依賴庫&#xff08;4 個主庫 2 個基礎庫&#xff09;另- HDF-EOS 手動編譯二、解壓并安裝 LDOPE參考下載方式1-&#xff08;簡…

克隆代幣 + 捆綁開盤:多鏈環境下的低成本發幣玩法

在加密世界&#xff0c;發幣已經不再是“少數開發者的專利”。隨著工具的普及&#xff0c;任何人都可以快速發行一個在加密世界&#xff0c;發幣已經不再是“少數開發者的專利”。隨著工具的普及&#xff0c;任何人都可以快速發行一個代幣。但問題是&#xff1a;如何在保證低成…

數據結構中的 二叉樹

1.前言 在 Java 中&#xff0c;樹&#xff08;Tree&#xff09;是一種非線性數據結構&#xff0c;由節點&#xff08;Node&#xff09;組成&#xff0c;常見的線性表則是我們之前學過的順序表、鏈表、棧、隊列等等。每個節點包含數據和指向子節點的引用。樹的常見實現方式包括二…

IntelliJ IDEA 啟動項目時配置端口指南

&#x1f31f; 一、為什么需要手動設置啟動端口&#xff1f; 默認情況下&#xff0c;Spring Boot 應用會使用 8080 端口啟動。但在以下場景中&#xff0c;我們必須自定義端口&#xff1a; 多個微服務同時運行&#xff0c;需避免端口沖突&#xff1b;團隊協作開發&#xff0c;統…

spark sql之from_json函數

目錄前言函數語法參數說明返回值案例案例1案例2前言 在Spark SQL中&#xff0c;from_json函數用于解析包含JSON字符串的列&#xff0c;并將其轉換為Spark SQL的結構化類型&#xff08;如struct、map或array&#xff09; 函數語法 from_json(jsonStr, schema [, options])參數…

數據結構 之 【位圖的簡介】

目錄 1.位圖的引入 2.位圖概念 3.位圖的實現 3.1前提準備 3.2set 3.3reset 3.4test 4.位圖的應用 1.位圖的引入 給40億個不重復的無符號整數&#xff0c;沒排過序 再給一個無符號整數&#xff0c;如何快速判斷這個無符號整數是否在 這40億個數中 首先&#xff0c;一個…

[iOS] ViewController 的生命周期

文章目錄前言一、UIViewController 生命周期有關函數二、UIViewController 中函數的執行順序運行結果1.present和dismiss2.push和pop三、總結前言 UIViewController 是在 iOS 開發中一個非常重要的角色&#xff0c;他是 view 和 model 的橋梁&#xff0c;通過 UIViewControlle…

第30章 零售與電商AI應用

本章將深入探討人工智能在零售與電商領域的革命性應用。我們將從智能推薦系統、動態定價、庫存管理到創新的虛擬試衣間&#xff0c;全面解析AI如何重塑購物體驗和商業運營效率&#xff0c;并為每個關鍵技術點提供代碼實戰&#xff0c;幫助你掌握將AI應用于真實商業場景的能力。…

QT通過QModbusRtuSerialMaster讀寫電子秤數據實例

一、電子稱常用功能&#xff1a;稱重、清零、去皮&#xff1b;電子秤的通訊方式&#xff1a;Modbus通信、串口通信。二、QT讀寫電子秤軟件界面如下&#xff1a;三、核心代碼如下&#xff1a;.pro項目文件代碼&#xff1a;QT core gui serialbus serialport.h頭文件代碼#…

sqlmap常用命令

ZZHow(ZZHow1024) 一、掃描注入點 1.GET方法&#xff0c;給URL&#xff1a; #探測該url是否存在漏洞 python sqlmap.py -u "http://192.168.10.1/sqli/Less-1/?id1"#如果我們已經知道admin這里是注入點的話&#xff0c;可以在其后面加個*來讓sqlmap對其注入 python …

JVM如何排查OOM

當JVM&#xff08;Java虛擬機&#xff09;出現OOM&#xff08;OutOfMemoryError&#xff09;時&#xff0c;可以按照以下步驟和方法&#xff0c;用于幫助定位和解決JVM中的OOM問題1.查看異常堆棧信息查看異常堆棧信息&#xff08;StackTrace&#xff09;是定位問題的關鍵。OOM異…

存算一體芯片生態評估:從三星PIM到知存科技WTM2101

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;存算一體技術的崛起與意義 在傳統馮諾…

[數據結構] 棧 · Stack

一.棧 stack 1.概念 棧 : 一種特殊的線性表 , 其只允許再固定的一段進行插入和刪除元素操作 進行數據插入和刪除操作的一段稱為 棧頂 ; 另一端稱為棧底棧中的數據元素遵循 先進后出 原則(LIFO)壓棧 : 棧的插入操作叫做 進棧 或 壓棧 或 入棧 , 入數據在棧頂出棧 : 棧的刪除…