Spring 核心技術解析【純干貨版】- XVI:Spring 網絡模塊 Spring-WebMvc 模塊精講

在現代 Web 開發中,高效、穩定、可擴展的框架至關重要。Spring WebMvc 作為 Spring Framework 的核心模塊之一,為開發人員提供了強大的 MVC 體系支持,使得 Web 應用的構建更加便捷和規范。無論是傳統的 JSP 視圖渲染,還是基于 RESTful 的 API 設計,Spring WebMvc 都能提供完善的解決方案。

本篇文章將深入解析 Spring WebMvc 模塊的核心概念、依賴關系、組件架構及其應用場景,并通過一個完整的示例,幫助讀者理解如何使用 Spring WebMvc 構建高效的 Web 應用。希望通過本篇內容,讓你能更加熟練地掌握 Spring MVC 及其實踐應用。


文章目錄

      • 1、Spring WebMvc 模塊介紹
        • 1.1、Spring WebMvc 模塊概述
        • 1.2、Spring WebMvc 模塊依賴
        • 1.3、Spring WebMvc 模塊作用
        • 1.4、Spring WebMvc 核心組件說明
      • 2、關于 MVC 模式
      • 3、Spring MVC 案例:使用 Spring Web 進行 RESTful API 調用
        • 3.1、項目結構
        • 3.2、配置 web.xml
        • 3.3、配置 Spring MVC
        • 3.4、創建模型 (Model)
        • 3.5、創建服務層 (Service)
        • 3.6、創建控制器 (Controller)
        • 3.7、創建視圖 (JSP)
        • 3.8、 運行項目
      • X、后記


1、Spring WebMvc 模塊介紹

1.1、Spring WebMvc 模塊概述

Spring WebMvc 是 Spring Framework 的核心模塊之一,專門用于構建基于 MVC(Model-View-Controller)設計模式的 Web 應用程序。作為 Spring 對 Servlet API 的封裝實現,它通過清晰的職責劃分和高效的請求處理機制,簡化了傳統同步 Web 應用及 REST API 的開發流程。

該模塊的核心特性包括:

  • 注解驅動開發:通過 @Controller@RestController@RequestMapping 等注解實現請求路由與處理。
  • 視圖解析與渲染:支持 JSP、Thymeleaf、FreeMarker 等多種視圖技術。
  • 數據綁定與校驗:自動封裝請求參數到對象,集成 Hibernate Validator 等校驗框架。
  • 攔截器與過濾器:通過 HandlerInterceptor 實現預處理和后處理邏輯。
  • 異常統一處理:支持全局異常處理機制(@ControllerAdvice)和自定義錯誤頁面。
  • RESTful 支持:通過 @RequestBody@ResponseBody 實現 JSON/XML 數據交互。

Spring WebMvc 遵循 “約定優于配置” 原則,既能通過 XML 配置實現傳統開發模式,也可借助 Spring Boot 實現零配置快速啟動,廣泛應用于企業級 Web 應用開發。

1.2、Spring WebMvc 模塊依賴

Spring WebMvc 的底層實現依賴于以下 Spring 核心模塊:

模塊作用
Spring Core提供 IOC 容器、資源加載、類型轉換等基礎功能,是框架的基石。
Spring Beans管理 Bean 的生命周期、依賴注入(DI),支持 @Autowired 等注解。
Spring Context擴展 Core 模塊,提供國際化、事件傳播、AOP 集成等企業級特性。
Spring AOP支持面向切面編程,實現事務管理、日志記錄等橫切關注點。
Spring Web提供基礎的 Web 功能(如 Multipart 文件上傳),是 WebMvc 的前置依賴。
Spring Expression (SpEL)支持運行時表達式解析,用于動態綁定請求參數、條件路由等場景。

:在 Maven/Gradle 項目中,直接引入 spring-webmvc 依賴會自動關聯上述模塊。此外,實際開發中常需集成 spring-jdbc(數據庫訪問)、spring-security(安全控制)等擴展模塊。

1.3、Spring WebMvc 模塊作用

核心作用:

  1. 請求處理流水線基于 DispatcherServlet 的前端控制器模式,將 HTTP 請求分發給對應的 Controller,處理流程包括:

    • 路由匹配(HandlerMapping
    • 參數綁定(DataBinder
    • 業務邏輯執行(Controller
    • 視圖渲染(ViewResolver
    • 異常處理(HandlerExceptionResolver
  2. 分層架構支持: Model:通過 POJO 或 Model 對象封裝業務數據。View:解耦視圖技術,支持模板引擎或靜態頁面。Controller:集中處理用戶請求,協調業務邏輯與數據呈現。

  3. 擴展性與兼容性 :可集成第三方組件(如 Spring Security、Swagger)。兼容 Servlet 3.0+ 規范,支持異步請求處理(DeferredResult/Callable)。

1.4、Spring WebMvc 核心組件說明

Spring WebMvc 下述組件的協同工作,Spring WebMvc 實現了高度可定制化的 Web 開發框架,兼顧靈活性與開發效率:

  • DispatcherServlet:中央調度器,協調各組件完成請求處理生命周期。
  • HandlerMapping:根據 URL 匹配對應的 Controller 方法。
  • HandlerAdapter:適配不同處理器類型(如 @Controller、Servlet)。
  • ViewResolver:將邏輯視圖名解析為具體視圖實現(如 JSP 頁面)。
  • MultipartResolver:處理文件上傳請求。
  • LocaleResolver:支持國際化與本地化。

2、關于 MVC 模式

MVC(Model-View-Controller) 是一種 軟件架構模式,用于分離應用的業務邏輯、數據管理和用戶界面,提高代碼的可維護性和可擴展性。

MVC 的三個部分:

  • Model(模型)—— 負責數據和業務邏輯:負責存儲、處理和管理數據(如數據庫操作)。不直接與視圖交互,而是通過控制器提供數據。例子:在 Spring MVC 中,@Service@Repository 處理業務邏輯和數據庫訪問。

  • View(視圖)—— 負責展示數據:負責向用戶顯示數據,通常是 HTML、JSP、Thymeleaf、React/Vue 等前端技術。不能直接操作 Model,而是通過 Controller 訪問數據。例子:在 Spring MVC,JSP、Thymeleaf 或者 JSON 數據可以作為視圖。

  • Controller(控制器)—— 負責處理請求:接收用戶請求,調用 Model 處理業務邏輯,并返回數據給 View。控制器負責 路由、參數解析、返回數據。例子:在 Spring MVC,@Controller@RestController 處理 HTTP 請求。

MVC 的工作流程:

  1. 用戶在瀏覽器輸入 http://localhost:8080/users,請求被 Controller 接收。
  2. Controller 調用 Model 處理業務邏輯(如查詢數據庫)。
  3. Model 返回數據給 Controller,然后 Controller 將數據傳遞給 View。
  4. View 生成 HTML 頁面,并返回給用戶。

MVC 的優點:

  • 低耦合:Model、View、Controller 彼此獨立,可以單獨修改某一部分,而不會影響其他部分。
  • 可維護性強:業務邏輯和 UI 分離,代碼更容易管理和擴展。
  • 適用于多種視圖層:一個后端可以支持多個前端(如 Web、移動端)。

3、Spring MVC 案例:使用 Spring Web 進行 RESTful API 調用

3.1、項目結構
spring-mvc-demo/
├── src/main/java/com/example/controller/UserController.java
├── src/main/java/com/example/model/User.java
├── src/main/java/com/example/service/UserService.java
├── src/main/java/com/example/config/WebConfig.java
├── src/main/webapp/WEB-INF/views/
│   ├── users.jsp
│   ├── user.jsp
├── src/main/webapp/WEB-INF/web.xml
├── pom.xml
3.2、配置 web.xml

Spring MVC 需要在 web.xml 中配置 DispatcherServlet 作為前端控制器: src/main/webapp/WEB-INF/web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee"version="3.0"><!-- 配置 Spring MVC 的前端控制器 --><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc-config.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><!-- 配置字符編碼 --><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><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>
3.3、配置 Spring MVC

src/main/webapp/WEB-INF/spring-mvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 啟用 Spring MVC 注解 --><mvc:annotation-driven/><!-- 組件掃描 --><context:component-scan base-package="com.example"/><!-- 視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean></beans>
3.4、創建模型 (Model)

src/main/java/com/example/model/User.java

package com.example.model;public class User {private Long id;private String name;private String email;public User() {}public User(Long id, String name, String email) {this.id = id;this.name = name;this.email = email;}public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }
}
3.5、創建服務層 (Service)

src/main/java/com/example/service/UserService.java

package com.example.service;import com.example.model.User;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;
import java.util.Optional;@Service
public class UserService {private final List<User> users = new ArrayList<>();public UserService() {users.add(new User(1L, "張三", "zhangsan@example.com"));users.add(new User(2L, "李四", "lisi@example.com"));}public List<User> getAllUsers() {return users;}public Optional<User> getUserById(Long id) {return users.stream().filter(user -> user.getId().equals(id)).findFirst();}public void addUser(User user) {users.add(user);}
}
3.6、創建控制器 (Controller)

src/main/java/com/example/controller/UserController.java

package com.example.controller;import com.example.model.User;
import com.example.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;import java.util.List;@Controller
@RequestMapping("/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMappingpublic String getAllUsers(Model model) {List<User> users = userService.getAllUsers();model.addAttribute("users", users);return "users";}@GetMapping("/{id}")public String getUserById(@PathVariable Long id, Model model) {userService.getUserById(id).ifPresent(user -> model.addAttribute("user", user));return "user";}@PostMappingpublic String addUser(@ModelAttribute User user) {userService.addUser(user);return "redirect:/users";}
}
3.7、創建視圖 (JSP)

src/main/webapp/WEB-INF/views/users.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用戶列表</title>
</head>
<body><h2>用戶列表</h2><ul><c:forEach var="user" items="${users}"><li><a href="users/${user.id}">${user.name}</a></li></c:forEach></ul>
</body>
</html>

src/main/webapp/WEB-INF/views/user.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用戶詳情</title>
</head>
<body><h2>用戶詳情</h2><p>姓名: ${user.name}</p><p>郵箱: ${user.email}</p><a href="/users">返回列表</a>
</body>
</html>
3.8、 運行項目

使用 Tomcat 部署,或者在 IDE 中運行:

mvn tomcat7:run

然后訪問:

  • http://localhost:8080/users 獲取所有用戶
  • http://localhost:8080/users/1 獲取特定用戶信息

X、后記

Spring WebMvc 模塊是構建現代 Web 應用的重要基石,它提供了清晰的架構分層,使開發者能夠專注于業務邏輯,而無需過多關注底層的請求處理細節。通過 DispatcherServlet 這一核心組件,Spring WebMvc 實現了從請求到視圖渲染的完整流程,并結合 Spring 的強大生態系統,提供了豐富的擴展能力。

本篇文章從基礎概念到實際應用,系統地介紹了 Spring WebMvc 的核心功能,希望能為你的 Web 開發提供實用的指導。在實際開發中,建議結合 Spring Boot 進行整合,以實現更快速的配置和開發。如果你對 Web 開發有更深入的需求,可以進一步探索 Spring Security、Spring Cloud 等相關技術,不斷提升自身的技術能力。

愿你的開發之旅更加高效順暢!

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

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

相關文章

MySQL系統庫匯總

目錄 簡介 performance_schema 作用 分類 簡單配置與使用 查看最近執行失敗的SQL語句 查看最近的事務執行信息 sys系統庫 作用 使用 查看慢SQL語句慢在哪 information_schema 作用 分類 應用 查看索引列的信息 mysql系統庫 權限系統表 統計信息表 日志記錄…

標題:利用 Rork 打造定制旅游計劃應用程序:一步到位的指南

引言&#xff1a; 在數字化時代&#xff0c;旅游計劃應用程序已經成為旅行者不可或缺的工具。但開發一個定制的旅游應用可能需要耗費大量時間與精力。好消息是&#xff0c;Rork 提供了一種快捷且智能的解決方案&#xff0c;讓你能輕松實現創意。以下是使用 Rork 創建一個定制旅…

GATT(Generic Attribute Profile)是藍牙低功耗(Bluetooth Low Energy,簡稱BLE)協議棧中的一個核心協議

藍牙的 GATT&#xff08;Generic Attribute Profile&#xff09; 是藍牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;簡稱BLE&#xff09;協議棧中的一個核心協議&#xff0c;用于定義設備如何通過藍牙進行數據傳輸和交互。GATT 是基于 ATT&#xff08;Attribute Proto…

[ deepseek 指令篇章 ]300個領域和賽道喂飯級deepseek指令

&#x1f36c; 博主介紹 &#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【數據通信】 【通訊安全】 【web安全】【面試分析】 &#x1f389;點贊?評論?收藏 養成習…

數據結構 -- 圖的存儲

圖的存儲 鄰接矩陣法 鄰接矩陣存儲不帶權圖 0 - 表示兩個頂點不鄰接 1 - 表示兩個頂點鄰接 在無向圖中&#xff0c;每條邊在矩陣中對應兩個1 在有向圖中&#xff0c;每條邊在矩陣中對應一個1 //不帶權圖的鄰接矩陣存儲 #define MaxVertexNum 100 //頂點數目的最大值 typed…

25.4.4錯題分析

計算機組成原理 總線特點 考察總線特點&#xff0c;串行總線&#xff0c;一次只傳1bit&#xff0c;采用單條電纜&#xff0c;抗干擾能力強&#xff0c;傳輸距離較遠&#xff0c;成本低&#xff0c;但傳輸速度慢&#xff0c;延遲較高&#xff0c;不適用大規模數據傳輸 并行總線…

規則引擎Drools

1.規則引擎概述 1.1 什么是規則引擎 規則引擎 全稱為業務規則管理系統&#xff0c;英文名為BRMS&#xff0c;規則引擎的主要思想是將應用程序中的業務決策部分分離出來&#xff0c;并使用預定義的語義模塊編寫業務規則&#xff0c;由用戶或開發者在需要時進行配置和管理。 需…

框架PasteForm實際開發案例,換個口味顯示數據,支持echarts,只需要標記幾個特性即可在管理端顯示(2)

PasteForm框架的主要思想就是對Dto進行標記特性,然后管理端的頁面就會以不一樣的UI呈現 使用PasteForm框架開發,讓你免去開發管理端的煩惱,你只需要專注于業務端和用戶端! 在管理端中,如果說表格是基本的顯示方式,那么圖表chart就是一個錦上添花的體現! 如果一個項目擁…

【工具】在 Visual Studio 中使用 Dotfuscator 對“C# 類庫(DLL)或應用程序(EXE)”進行混淆

在 Visual Studio 中使用 Dotfuscator 進行混淆 Dotfuscator 是 Visual Studio 自帶的混淆工具&#xff08;Dotfuscator Community Edition&#xff0c;簡稱 CE&#xff09;。它可以混淆 C# 類庫&#xff08;DLL&#xff09;或應用程序&#xff08;EXE&#xff09;&#xff0c…

線程同步與互斥(上)

上一篇&#xff1a;線程概念與控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我們學習了線程的控制及其相關概念之后&#…

[Linux系統編程]進程信號

進程信號 1. 信號入門1.1 信號基本概念1.2 技術應用角度的信號2. 信號的產生2.1 通過終端按鍵(如鍵盤)產生信號2.2 通過異常產生信號2.3 調用系統函數向進程發信號2.4 由軟件條件產生信號2.5 總結3. 阻塞信號3.1 信號其他相關常見概念3.2 內核中的信號表示3.3 sigset_t3.3.1 …

要素的選擇與轉出

1.要素選擇的三種方式 當要在已有的數據中選擇部分要素時&#xff0c;ArcMap提供了三種方式:按屬性選擇、位置選擇及按圖形選擇。 1)按屬性選擇 通過設置 SQL查詢表達式&#xff0c;用來選擇與選擇條件匹配的要素。 (1)單擊主菜單下【選擇】【按屬性選擇】&#xff0c;打開【按…

Springboot + Vue + WebSocket + Notification實現消息推送功能

實現功能 基于Springboot與Vue架構&#xff0c;首先使用Websocket實現頻道訂閱&#xff0c;在實現點對點與群發功能后&#xff0c;在前端調用windows自帶的消息通知&#xff0c;實現推送功能。 開發環境 Springboot 2.6.7vue 2.6.11socket-client 1.0.0 準備工作 在 Vue.js…

云手機如何防止設備指紋被篡改

云手機如何防止設備指紋被篡改 云手機作為虛擬化設備&#xff0c;其設備指紋的防篡改能力直接關系到賬戶安全、反欺詐和隱私保護。以下以亞矩陣云手機為例&#xff0c;講解云手機防止設備指紋被篡改的核心技術及實現方式&#xff1a; 系統層加固&#xff1a;硬件級安全防護 1…

有人DTU使用MQTT協議控制Modbus協議的下位機-含數據庫

本文為備忘錄&#xff0c;不做太多解釋。 DTU型號&#xff1a;G780 服務器&#xff1a;win2018 一。DTU設置 正確設置波特率&#xff0c;進入配置狀態&#xff0c;獲取當前參數&#xff0c;修改參數&#xff0c;設置并保存所有參數。 1.通道1設置 2.Modbus輪詢設置 二&am…

湖北師范大學計信學院研究生課程《工程倫理》9.6章節練習

以下是圖片中識別出的文字內容: 1【單選題】當工程師發現所在的企業或公司進行的工程活動會對環境、社會和公眾的人身安全產生危害時,應該及時地給予反映或揭發。這屬于工程師的( ) A、職業倫理責任 B、社會倫理責任 C、個人倫理責任 D、法律責任 2【單選題】下列哪個不屬于工…

Axure RP 9 詳細圖文安裝流程(附安裝包)教程包含下載、安裝、漢化、授權

文章目錄 前言一、Axure RP 9介紹二、Axure RP 9 安裝流程1. Axure RP 9 下載2. 啟動安裝程序3. 安裝向導操作4.完成安裝 三、Axure RP 9 漢化四、Axure RP 9授權 前言 本基礎安裝流程教程&#xff0c;將以清晰、詳盡且易于遵循的步驟介紹Axure RP 9 詳細圖文安裝流程&#xf…

SpringBoot全局exception處理最佳實踐

目錄 自定義異常類 拋出異常 全局異常處理器 自定義異常類 通常會繼承 Exception 或其子類(如 RuntimeException)來定義業務異常類,用于封裝業務相關的錯誤信息。一般選擇繼承 RuntimeException,因為它是一個非受檢異常,在方法中拋出時不需要顯式聲明。 // 自定義業…

node ---- 解決錯誤【Error: error:0308010C:digital envelope routines::unsupported】

1. 報錯 在 Node.js 18.18.0 的版本中&#xff0c;遇到以下錯誤&#xff1a; this[kHandle] new _Hash(algorithm, xofLen);^ Error: error:0308010C:digital envelope routines::unsupported這個錯誤通常發生在運行項目或構建時&#xff0c;尤其是在使用 Webpack、Vite 或其他…

浙江大學鄭小林教授解讀智能金融與AI的未來|附PPT下載方法

導 讀INTRODUCTION 隨著人工智能技術的飛速發展&#xff0c;智能金融已成為金融行業的重要變革力量。浙江大學人工智能研究所的鄭小林教授在2025年3月24日的《智能金融&#xff1a;AI驅動的金融變革》講座中&#xff0c;深入探討了新一代人工智能在金融領域的應用及未來展望。 …