Spring MVC:從歷史演變到實戰入門

1. Java Web的發展歷史與MVC模式

1.1 Model I與Model II的演進

Model I(JSP+JavaBean)
作為早期Java Web開發的主流模式,其核心架構如下:

graph LR
A[客戶端] --> B[JSP頁面]
B --> C{業務邏輯}
C --> D[JavaBean]
D --> B
B --> A

痛點分析

  • JSP同時承擔視圖渲染與業務控制,代碼耦合度高

  • 項目規模擴大后維護成本指數級增長

Model II(Servlet+JSP+JavaBean)
通過分層思想實現解耦:

graph LR
A[客戶端] --> B[Servlet]
B --> C{控制邏輯}
C --> D[JavaBean]
D --> E[JSP]
E --> A

優勢

  • 職責分離:Servlet負責流程控制,JSP專注視圖展示

  • 更適合大型項目開發

1.2 MVC設計模式的精髓

組件職責說明具體實現
Model數據處理與業務邏輯Service/Dao/Entity
View用戶界面與數據展示JSP/Thymeleaf模板
Controller請求調度與響應處理@Controller注解類

2. Spring MVC快速入門實戰

2.1 環境搭建(IntelliJ IDEA演示)

Maven依賴配置

<properties><spring.version>5.3.18</spring.version>
</properties><dependencies><!-- Spring MVC核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- 視圖解析 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.15.RELEASE</version></dependency>
</dependencies>

2.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><!-- 前端控制器 -->
<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:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>

Spring MVC配置(spring-mvc.xml)

<!-- 組件掃描 -->
<context:component-scan base-package="com.example.controller"/><!-- 視圖解析器 -->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine"/>
</bean><!-- 模板引擎配置 -->
<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".html"/></bean></property>
</bean>

2.3 控制器開發實例

@Controller
public class HelloController {@GetMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Welcome to Spring MVC!");return "result-page";}
}

頁面結構

src
├── main
│   ├── webapp
│   │   └── WEB-INF
│   │       └── views
│   │           └── result-page.html

3. Spring MVC核心原理剖析

3.1 請求處理全流程

  1. DispatcherServlet接收請求
    作為統一入口,攔截所有HTTP請求

  2. HandlerMapping路由匹配
    根據URL找到對應的Controller方法

  3. HandlerAdapter執行處理
    通過反射調用目標方法

  4. 視圖解析與渲染
    將邏輯視圖名轉換為物理視圖路徑

sequenceDiagram
客戶端->>DispatcherServlet: HTTP請求
DispatcherServlet->>HandlerMapping: 查詢處理器
HandlerMapping-->>DispatcherServlet: 返回Handler
DispatcherServlet->>HandlerAdapter: 執行處理器
HandlerAdapter->>Controller: 調用方法
Controller-->>HandlerAdapter: 返回ModelAndView
HandlerAdapter-->>DispatcherServlet: 返回結果
DispatcherServlet->>ViewResolver: 解析視圖
ViewResolver-->>DispatcherServlet: 返回視圖
DispatcherServlet->>View: 渲染視圖
View-->>客戶端: 響應HTML

3.2 核心組件詳解

組件職責說明默認實現類
HandlerMapping請求到處理器的映射RequestMappingHandlerMapping
HandlerAdapter執行處理器方法RequestMappingHandlerAdapter
ViewResolver解析邏輯視圖名InternalResourceViewResolver
HandlerExceptionResolver異常處理ExceptionHandlerExceptionResolver

4. 開發技巧與最佳實踐

  1. RESTful風格設計

@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {// 業務邏輯}
}

????????2.統一異常處理

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception ex) {ModelAndView mav = new ModelAndView();mav.addObject("errorMsg", ex.getMessage());mav.setViewName("error-page");return mav;}
}

3.?參數驗證技巧

@PostMapping("/register")
public String register(@Valid User user, BindingResult result) {if (result.hasErrors()) {return "register-form";}// 處理注冊邏輯
}

5. 常見問題排查指南

問題1:404未找到頁面
? 檢查項:

  • 控制器是否添加@Controller注解

  • 請求路徑是否匹配@RequestMapping

  • 視圖文件位置是否符合配置的prefix/suffix

問題2:參數綁定失敗
? 解決方案:

  • 檢查表單字段名與POJO屬性名是否一致

  • 使用@RequestParam指定參數名稱

  • 添加BindingResult參數捕獲錯誤

6. 性能優化建議

  1. 啟用緩存

@Cacheable("users")
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {// 數據庫查詢
}

?????????2.異步處理

@Async
public CompletableFuture<User> fetchUserAsync(Long id) {// 異步操作
}

?????????3.靜態資源優化

結語

<mvc:resources mapping="/static/**" location="/static/" cache-period="31556926"/>

通過本文的學習,我們不僅掌握了Spring MVC的核心原理,還完成了從環境搭建到實戰開發的完整流程。建議讀者在掌握基礎后,繼續深入以下方向:

  1. 深入理解攔截器(Interceptor)機制

  2. 研究Spring Boot對MVC的自動化配置

  3. 探索響應式編程WebFlux框架

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

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

相關文章

AI賦能,防御無界:群聯云防護如何顛覆傳統DDoS防御格局?

一、AI驅動的動態防御體系 智能流量調度 群聯云防護通過AI算法實時分析流量特征&#xff0c;動態分配清洗節點。當檢測到攻擊時&#xff0c;系統能在秒級內將流量切換至備用節點&#xff0c;避免單點過載。相較傳統高防IP依賴靜態規則&#xff0c;群聯的調度策略可減少50%的誤封…

R --- Error in library(***) : there is no package called ‘***’ (服務器非root用戶)

步驟 步驟一&#xff1a;在自己目錄下創建R包安裝路徑步驟二&#xff1a;配置用戶本地的R庫路徑步驟三&#xff1a;安裝缺失的包&#xff08;在終端&#xff09;步驟四&#xff1a;驗證安裝 步驟一&#xff1a;在自己目錄下創建R包安裝路徑 mkdir -p ~/R_libs步驟二&#xff1…

HarmonyOS NEXT狀態管理實踐

在HarmonyOS NEXT開發中&#xff0c;狀態管理是構建高效、響應式應用的核心。本文深入探討狀態管理的最佳實踐&#xff0c;結合代碼示例與案例分析&#xff0c;幫助開發者掌握這一關鍵技能。 一、狀態管理裝飾器的合理使用 HarmonyOS NEXT提供多種狀態管理裝飾器&#xff0c;…

excel 時間戳 轉日期

在Excel中&#xff0c;將時間戳轉換為日期格式&#xff0c;可以使用以下步驟和方法&#xff1a; 一、了解時間戳 時間戳&#xff08;Timestamp&#xff09;通常是從1970年1月1日&#xff08;UTC時間&#xff09;開始的秒數或毫秒數。這個時間點被稱為“Unix紀元”或“Unix時間…

Python CSV 數據分析:問題排查與解決全記錄

Python CSV 數據分析&#xff1a;問題排查與解決全記錄 前段時間&#xff0c;我接到一個任務&#xff0c;需要對公司的銷售數據進行分析。這些數據存儲在 CSV 文件里&#xff0c;本想著用 Python 處理起來會很輕松&#xff0c;結果卻狀況百出。下面&#xff0c;就跟大家講講我…

一些常用開發軟件下載地址

1. Matlab官方下載地址 MATLAB Runtime 是運行由 MATLAB 編譯的應用程序&#xff08;如 .exe、.jar 或 .dll&#xff09;所必需的組件&#xff0c;無需安裝完整 MATLAB。 &#x1f517; MathWorks 官方下載頁面&#xff1a; https://www.mathworks.com/products/compiler/mat…

06-SpringBoot3入門-常見注解(簡介)

1、Controller ResponseBody Controller是Spring MVC 中的注解&#xff0c;負責處理 HTTP 請求。 ResponseBody是Spring MVC 中的注解&#xff0c;用于直接將方法的返回值作為 HTTP 響應體。 2、RestController RestController Controller ResponseBody 3、RequestMappin…

ubuntu24.04.2 NVIDIA GeForce RTX 4060筆記本安裝驅動

https://www.nvidia.cn/drivers/details/242281/ 上面是下載地址 sudo chmod x NVIDIA-Linux-x86_64-570.133.07.run # 賦予執行權限把下載的驅動復制到家目錄下&#xff0c;基本工具準備&#xff0c;如下 sudo apt update sudo apt install build-essential libglvnd-dev …

【數據庫相關MySql、Redis、MongoDB】

一、三種數據庫的對比 MongoDB、MySQL 和 Redis 是三種不同類型的數據庫系統&#xff0c;它們在數據模型、存儲方式、性能特點、適用場景等方面存在顯著區別。以下是它們的詳細對比&#xff1a; 1. 數據模型 MySQL 類型&#xff1a;RDBMS&#xff08;關系型數據庫&#xff0…

《Express:Node.js 里的 “閃電俠”》

“你就坐在我身邊&#xff0c;好不好” 什么是Express 官方給出的概念&#xff1a;Express 是基于 Node.js 平臺&#xff0c;快速、開放、極簡的 Web 開發框架。 通俗的理解&#xff1a;Express 的作用和 Node.js 內置的 http 模塊類似&#xff0c;是專門用來創建 Web 服務器…

vue遺漏的知識點(動態組件.組件庫的操作使用)

----動態組件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的內置組件&#xff0c;用于動態渲染其他組件。:is 屬性 用于指定要渲染的組件。它的值可以是&#xff1a; 組件的名稱&#xff08;字符串&#xf…

vue 項目啟動報錯可以讓 cursor啟動

vue 項目啟動報錯可以讓 cursor啟動

SQL EXISTS 與 NOT EXISTS 運算符

EXISTS 和 NOT EXISTS 是 SQL 中的邏輯運算符&#xff0c;用于檢查子查詢是否返回任何行。它們通常用在 WHERE 子句中&#xff0c;與子查詢一起使用。 EXISTS 運算符 EXISTS 運算符用于檢查子查詢是否返回至少一行數據。如果子查詢返回任何行&#xff0c;EXISTS 返回 TRUE&…

Android設計模式之模板方法模式

一、定義&#xff1a; 定義一個操作中的算法的框架&#xff0c;而將一些步驟延遲到子類中&#xff0c;使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 二、結構&#xff1a; AbstractClass抽象類&#xff1a;定義算法的骨架&#xff0c;包含模板方法和若干…

Vue3當中el-tree樹形控件使用

tree懸停tooltip效果 文本過長超出展示省略號 如果文本超出懸停顯示tooltip效果 反之不顯示 這里直接控制固定寬度限制 試了監聽寬度沒效果<template><el-treeshow-checkbox:check-strictly"true":data"data"node-key"id":props"…

QScreen 捕獲屏幕(截圖)

一、QScreen核心能力解析 硬件信息獲取 // 獲取主屏幕對象 QScreen* primaryScreen QGuiApplication::primaryScreen();// 輸出屏幕參數 qDebug() << "分辨率:" << primaryScreen->size(); qDebug() << "物理尺寸:" << primar…

PDF處理控件Aspose.PDF教程:通過C#、Java 和 Python刪除 PDF中的水印

Aspose.PDF 是一個功能強大的庫&#xff0c;旨在以編程方式處理 PDF 文檔&#xff0c;提供創建、編輯、轉換和操作的廣泛功能。它支持 C#、Java 和 Python 等多種編程語言&#xff0c;使開發人員能夠精確高效地自動處理 PDF。 對于開發人員來說&#xff0c;由于自動化和定制化…

基于STC89C51的太陽自動跟蹤系統的設計與實現—單片機控制步進電機實現太陽跟蹤控制(仿真+程序+原理圖+PCB+文檔)

摘 要 隨著我國經濟的飛速發展&#xff0c;促使各種能源使用入不敷出&#xff0c;尤其是最主要的能源&#xff0c;煤炭石油資源不斷消耗與短缺&#xff0c;因此人類尋找其他替代能源的腳步正在加快。而太陽能則具有無污染﹑可再生﹑儲量大等優點&#xff0c;且分布范圍廣&…

【硬件測試】基于FPGA的16QAM+幀同步系統開發與硬件片內測試,包含高斯信道,誤碼統計,可設置SNR

目錄 1.算法硬件測試效果 2.算法涉及理論知識概要 2.1 16QAM調制解調原理 2.2 幀同步 3.Verilog核心程序 4.開發板使用說明和如何移植不同的開發板 5.完整算法代碼文件獲得 1.算法硬件測試效果 本文是之前寫的文章: 《基于FPGA的16QAM幀同步系統verilog開發,包含testb…

多路徑 TCP 調度的另一面

參考前面的文章 一個原教旨的多路徑 TCP 和 MP-BBR 公平性推演&#xff0c;一直都破而不立&#xff0c;不能光說怎樣不好&#xff0c;還得說說現狀情況下&#xff0c;該如何是好。 如果 receiver 亂序重排的能力有限(拜 TCP 所賜)&#xff0c;如果非要在多路徑上傳輸 TCP&…