Spring MVC配置詳解:從歷史到實戰

文章目錄

  • 一、Java Web的發展歷程
    • 1.Model I與Model II開發模式
      • (1) Model I開發模式
      • (2)Model II開發模式
    • 2.MVC設計模式
      • Spring MVC本質
      • MVC工作流程
  • 二、Spring MVC快速入門實戰
    • 1.環境搭建步驟
      • (1)創建Maven Web工程
      • (2)配置web.xml
      • (3) Spring MVC配置文件(springmvc.xml)
      • (4) 編寫Controller
      • (5) 創建視圖頁面
  • 三、Spring MVC核心原理剖析
    • 1.請求處理全流程
      • (1)DispatcherServlet接收請求
      • (2)HandlerAdapter執行方法
      • (3)處理返回結果
      • (4)視圖渲染
    • 2.核心組件詳解
      • (1)Spring MVC 核心組件功能表
      • (2)組件協作示意圖
    • 3.架構優勢分析
  • 總結


一、Java Web的發展歷程

1.Model I與Model II開發模式

(1) Model I開發模式

核心架構:JSP + JavaBean
流程特點

  • JSP頁面直接處理用戶請求、執行業務邏輯(通過JavaBean)并渲染頁面
  • 優點:快速開發小型項目
  • 致命缺陷:視圖展示與業務邏輯高度耦合,JSP文件臃腫,維護困難
瀏覽器請求 → JSP接收請求 → 調用JavaBean → JSP渲染響應

(2)Model II開發模式

核心架構:JSP + Servlet + JavaBean
分層思想

  • JSP:專注視圖渲染
  • Servlet:負責流程控制(Controller前身)
  • JavaBean:處理業務邏輯(Service/DAO層)
瀏覽器請求 → Servlet接收 → 調用JavaBean → 轉發結果至JSP → 渲染響應

劃時代意義:首次實現MVC分層,支持中大型項目開發(2000年代主流架構)

2.MVC設計模式

Spring MVC本質

Spring MVC本質:基于Servlet的增強框架,核心思想遵循MVC規范

組件核心職責實現示例
Model1. 處理業務邏輯
2. 封裝數據對象
- @Service標注的業務類
- 實體類(如User.java
- DAO層實現類
View1. 數據可視化展示
2. 用戶交互界面
- JSP頁面(*.jsp
- Thymeleaf模板(*.html
- JSON響應(@ResponseBody
Controller1. 接收請求
2. 調用業務層
3. 返回響應
- @Controller注解類
- @RequestMapping方法
(如/user/login映射)

MVC工作流程

  1. 用戶通過View發起請求
  2. Controller接收并解析請求參數
  3. 調用Model層處理業務邏輯
  4. 返回處理結果至View渲染

二、Spring MVC快速入門實戰

1.環境搭建步驟

(1)創建Maven Web工程

關鍵依賴

<dependencies><!-- Spring MVC核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version></dependency><!-- 視圖模板引擎 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.14.RELEASE</version></dependency><!-- Servlet API --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
</dependencies>

(2)配置web.xml

核心配置項

<!-- 字符編碼過濾器 -->
<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter><!-- DispatcherServlet配置 -->
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><!-- 映射規則 -->
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

(3) Spring MVC配置文件(springmvc.xml)

<!-- 組件掃描 -->
<context:component-scan base-package="com.example.controller"/><!-- Thymeleaf視圖解析 -->
<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/>
</bean><bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver" ref="templateResolver"/>
</bean><bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine"/><property name="characterEncoding" value="UTF-8"/>
</bean><!-- 開啟注解驅動 -->
<mvc:annotation-driven/>

(4) 編寫Controller

@Controller
public class HelloController {@RequestMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Welcome to Spring MVC!");return "result"; // 對應/WEB-INF/views/result.html}
}

(5) 創建視圖頁面

result.html(Thymeleaf模板)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Result Page</title>
</head>
<body><h1 th:text="${message}">Default Message</h1>
</body>
</html>

三、Spring MVC核心原理剖析

1.請求處理全流程

(1)DispatcherServlet接收請求

  • 作為統一入口攔截所有請求
  • 通過HandlerMapping查找匹配的Controller方法

(2)HandlerAdapter執行方法

  • 參數綁定:自動將請求參數映射到方法參數
  • 執行@RequestMapping標注的方法

(3)處理返回結果

  • 返回String:通過ViewResolver解析為具體視圖
  • 返回@ResponseBody:直接序列化為JSON

(4)視圖渲染

  • 模板引擎處理動態內容
  • 生成最終HTML響應

2.核心組件詳解

(1)Spring MVC 核心組件功能表

組件名稱職責說明實現示例
DispatcherServlet前端控制器,統一處理所有HTTP請求和響應,協調各組件工作流程web.xml中配置的核心Servlet,默認名稱dispatcher,處理所有/請求
HandlerMapping建立請求URL與Controller方法的映射關系RequestMappingHandlerMapping(基于@RequestMapping注解的映射策略)
HandlerAdapter實際執行Controller方法,處理參數綁定、數據轉換、驗證等核心邏輯RequestMappingHandlerAdapter(支持基于注解的處理器方法)
ViewResolver將Controller返回的邏輯視圖名解析為具體的視圖實現(HTML/JSON等)InternalResourceViewResolver(JSP)、ThymeleafViewResolver(模板引擎)
HandlerExceptionResolver統一處理Controller層拋出的異常,返回定制化錯誤響應ExceptionHandlerExceptionResolver(配合@ExceptionHandler使用)

(2)組件協作示意圖

在這里插入圖片描述

3.架構優勢分析

  1. 松耦合設計:各組件通過接口定義,易于擴展
  2. 注解驅動開發:@Controller、@RequestMapping簡化配置
  3. 強大的數據綁定:自動處理表單數據、JSON轉換
  4. 視圖技術無關性:支持JSP、Thymeleaf、FreeMarker等

總結

Spring MVC通過清晰的層次劃分和強大的擴展能力,已成為Java Web開發的事實標準。理解其核心原理并掌握配置技巧,是構建高性能Web應用的關鍵。建議通過Debug模式跟蹤請求處理流程,深入體會各組件協作機制。

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

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

相關文章

老是忘記package.json,備忘一下 webpack 環境下 Vue Cli 和 Vite 命令行工具對比

Vue 2.X webpack 環境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…

【樹莓派Pico FreeRTOS】-Mutex(互斥體)

Mutex(互斥體) 文章目錄 Mutex(互斥體)1、硬件準備2、軟件準備3、FreeRTOS的Mutex介紹4、完整示例RP2040 由 Raspberry Pi 設計,具有雙核 Arm Cortex-M0+ 處理器和 264KB 內部 RAM,并支持高達 16MB 的片外閃存。 廣泛的靈活 I/O 選項包括 I2C、SPI 和獨特的可編程 I/O (P…

sock文件介紹--以mysql.sock為例

socket 文件 (.sock) 通常是臨時文件。 MySQL 的 socket 文件是臨時文件&#xff0c;只在服務運行時有效。可通過配置文件更改 socket 文件的存放路徑&#xff0c;常見路徑如 /tmp/mysql.sock 或指定自定義目錄。如果連接出現問題&#xff0c;可能需要檢查 MySQL 服務狀態或路…

Docker應用部署之mysql篇(day5)

文章目錄 前言一、問題描述二、解決方案1. 搜索 MySQL 鏡像2. 拉取 MySQL 鏡像3. 創建并運行 MySQL 容器參數說明&#xff1a; 4. 驗證容器是否運行5. 進入 MySQL 容器 三、總結 前言 在日常開發和部署中&#xff0c;MySQL 是最常用的關系型數據庫之一。借助 Docker&#xff0…

【Elasticsearch基礎】基本核心概念介紹

Elasticsearch作為當前最流行的分布式搜索和分析引擎&#xff0c;其強大的功能背后是一套精心設計的核心概念體系。本文將深入解析Elasticsearch的五大核心概念&#xff0c;幫助開發者構建堅實的技術基礎&#xff0c;并為高效使用ES提供理論支撐。 1 索引&#xff08;Index&…

Qt在ARM中,如何使用drmModeObjectSetProperty 設置 Plane 的 zpos 值

在 Qt 中直接使用 drmModeObjectSetProperty 設置 Plane 的 zpos 值需要結合 Linux DRM/KMS API 和 Qt 的底層窗口系統&#xff08;如 eglfs 平臺插件&#xff09;。以下是詳細步驟和代碼示例&#xff1a; 1. 原理說明 DRM/KMS 基礎&#xff1a; Plane&#xff1a;負責圖層合成…

MFC添加免費版大漠3.1233

先創建一個MFC工程&#xff0c; 添加dm.dll 方法一&#xff1a;通過類向導-添加類-類型庫中的MFC類-文件&#xff0c;選擇dm.dll&#xff0c;如果沒有"添加類型庫中的MFC類"選項就用方法二添加 方法二&#xff1a;添加-新建項-MFC-Active或TypeLib-實現接口位置選…

【Linux】應用層協議 HTTP

應用層協議 HTTP 一. HTTP 協議1. URL 地址2. urlencode 和 urldecode3. 請求與響應格式 二. HTTP 請求方法1. GET 和 POST (重點) 三. HTTP 狀態碼四. HTTP 常見報頭五. 手寫 HTTP 服務器 HTTP&#xff08;超文本傳輸協議&#xff09;是一種應用層協議&#xff0c;用于在萬維網…

【活動回顧】StarRocks Singapore Meetup #2 @Shopee

3 月 13 日&#xff0c;StarRocks 社區在新加坡成功舉辦了第二場 Meetup 活動&#xff0c;主題為“Empowering Customer-Facing Analytics”。本次活動在 Shopee 新加坡辦公室舉行&#xff0c;吸引了來自 Shopee、Grab 和 Pinterest 的專家講師以及 50 多位參會者。大家圍繞電商…

Retinexformer:基于 Retinex 的單階段 Transformer 低光照圖像增強方法

開頭發點牢騷&#xff1a;本來做的好好都都要中期了&#xff0c;導師怎么突然給我換題目啊。真是繃不住了......又要從頭開始學了&#xff0c;唉&#xff01; 原論文鏈接&#xff1a;Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement 低光…

后端——AOP異步日志

需求分析 在SpringBoot系統中&#xff0c;一般會對訪問系統的請求做日志記錄的需求&#xff0c;確保系統的安全維護以及查看接口的調用情況&#xff0c;可以使用AOP對controller層的接口進行增強&#xff0c;作日志記錄。日志保存在數據庫當中&#xff0c;為了避免影響接口的響…

flink廣播算子Broadcast

文章目錄 一、Broadcast二、代碼示例三.或者第二種(只讀取一個csv文件到廣播內存中)提示:以下是本篇文章正文內容,下面案例可供參考 一、Broadcast 為了關聯一個非廣播流(keyed 或者 non-keyed)與一個廣播流(BroadcastStream),我們可以調用非廣播流的方法 connect(),…

Redis 和 MySQL雙寫一致性的更新策略有哪些?常見面試題深度解答。

目錄 一. 業務數據查詢&#xff0c;更新順序簡要分析 二. 更新數據庫、查詢數據庫、更新緩存、查詢緩存耗時對比 2.1 更新數據庫&#xff08;最慢&#xff09; 2.2 查詢數據庫&#xff08;較慢&#xff09; 2.3 更新緩存&#xff08;次快&#xff09; 2.4 查詢緩存&#…

SRT協議

SRT&#xff08;Secure Reliable Transport&#xff09;是一種開源的視頻傳輸協議&#xff0c;專為高丟包、高延遲網絡環境設計&#xff0c;結合了UDP的低延遲和TCP的可靠性&#xff0c;廣泛應用于直播、遠程制作、視頻會議等場景。 定位&#xff1a;SRT協議的官方C/C實現庫&am…

“征服HTML引號惡魔:“完全解析手冊”!!!(quot;表示雙引號)

&#x1f6a8;&#x1f4e2; "征服HTML引號惡魔&#xff1a;“完全解析手冊” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;當引號變成"惡魔" &#x1f631; 是否遇到過這種情況&#xff1a; 寫HTML時滿心歡喜輸入<div title"他…

npm install 卡在創建項目:sill idealTree buildDeps

參考&#xff1a; https://blog.csdn.net/PengXing_Huang/article/details/136460133 或者再執行 npm install -g cnpm --registryhttps://registry.npm.taobao.org 或者換梯子

c++中cpp文件從編譯到執行的過程

C 文件從編寫到執行的過程可以分為幾個主要階段&#xff1a;編寫代碼、預處理、編譯、匯編、鏈接和運行。以下是每個階段的詳細說明&#xff1a; 1. 編寫代碼 這是整個過程的起點。程序員使用文本編輯器&#xff08;如 VSCode、Sublime Text 或其他 IDE&#xff09;編寫 C 源…

PROE 與 STL 格式轉換:開啟 3D 打印及多元應用的大門

在 3D 設計與制造的復雜生態中&#xff0c;將 PROE 格式轉換為 STL 格式絕非無端之舉&#xff0c;而是有著深厚且多元的現實需求作為支撐。 一、文件格式介紹? &#xff08;一&#xff09;PROE 格式? PROE 作為一款參數化設計軟件&#xff0c;采用基于特征的參數化建模技術…

開發中后端返回下劃線數據,要不要統一轉駝峰?

先說結論。看情況&#xff01;&#xff01;&#xff01;&#xff01; 前端 主要用 JS/TS 建議后端返回 camelCase&#xff0c;減少前端轉換成本。后端 主要是 Python/Go 建議保持 snake_case&#xff0c;前端做轉換。但是團隊統一風格最重要&#xff01;如果統一返回駝峰就駝峰…

docker pull時報錯:https://registry-1.docker.io/v2/

原文&#xff1a;https://www.cnblogs.com/sdgtxuyong/p/18647915 https://www.cnblogs.com/OneSeting/p/18532166 docker 換源&#xff0c;解決連接不上的問題。 編輯以下文件&#xff0c;不存在則創建&#xff1a; vim /etc/docker/daemon.json {"registry-mirrors&qu…