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.mzph.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;深入探讨了新一代人工智能在金融领域的应用及未来展望。 …