Spring MVC 讲解:从初始化流程到请求参数与 JSON 处理全解析(黑马课程ssm笔记总结)(day5)

上一节课的内容:Spring 整合 MyBatis 深度解析:从设计动机到 AOP 与事务的完整体系

📚 目录(点击跳转对应章节)

[一、Spring MVC 简介](#一、Spring MVC 简介)
[二、Controller 加载控制与业务 Bean 加载控制](#二、Controller 加载控制与业务 Bean 加载控制)
[三、Spring MVC 初始化配置类](#三、Spring MVC 初始化配置类)
四、请求映射路径的设置
[五、POST 请求中文乱码处理](#五、POST 请求中文乱码处理)
[六、非 JSON 格式请求参数处理](#六、非 JSON 格式请求参数处理)
[七、JSON 格式请求参数处理](#七、JSON 格式请求参数处理)
[八、@RequestParam 与 @RequestBody 的区别](#八、@RequestParam 与 @RequestBody 的区别)
九、日期类型的参数传递
十、总结


一、Spring MVC 简介

📌 图片解析

Spring MVC 是基于 MVC 设计模式 的 Web 框架,主要职责是:

  • 接收 HTTP 请求
  • 解析请求参数
  • 调用业务逻辑
  • 返回响应结果

整体请求流程可以抽象为:

复制代码
客户端请求
 → DispatcherServlet
 → Controller
 → Service
 → Dao
 → 返回响应

📌 核心角色说明

  • DispatcherServlet:前端控制器,所有请求的统一入口
  • Controller:处理请求,接收参数,返回结果
  • Model:封装数据
  • View:页面或 JSON 响应

二、Controller 加载控制与业务 Bean 加载控制

📌 图片解析

图片中展示的是 Spring MVC 的 双容器结构

复制代码
Spring 容器体系
│
├── Root 容器
│   ├── Service
│   ├── Dao
│   ├── DataSource
│   └── TransactionManager
│
└── Web 容器
    └── Controller

📌 设计目的

  • Web 层与业务层解耦
  • Controller 专注请求处理
  • Service 专注业务逻辑

📌 访问规则

  • Web 容器可以访问 Root 容器
  • Root 容器不能访问 Web 容器

三、Spring MVC 初始化配置类

📌 图片解析

该配置类用于 替代 web.xml,在服务器启动时完成 Spring MVC 的初始化。

java 复制代码
public class ServletContainersInitConfig
        extends AbstractAnnotationConfigDispatcherServletInitializer

1️⃣ getServletMappings

java 复制代码
return new String[]{"/"};
  • 设置 Spring MVC 的请求拦截路径
  • / 表示拦截所有请求
  • 所有请求交由 DispatcherServlet 处理

2️⃣ getServletConfigClasses

java 复制代码
return new Class[]{SpringMvcConfig.class};
  • 加载 Web 层配置
  • 扫描 Controller
  • 配置视图解析器、JSON 转换器等

3️⃣ getRootConfigClasses

java 复制代码
return new Class[]{SpringConfig.class};
  • 加载业务层配置
  • 包含 Service、Dao、数据源、事务管理

📌 总结

Spring MVC 初始化的本质是:
创建 DispatcherServlet + 创建父子容器


四、请求映射路径的设置

📌 图片解析

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/save")
    public void save() {}
}

最终访问路径:

复制代码
/user/save

📌 映射规则

  • 类级别定义模块路径
  • 方法级别定义功能路径

五、POST 请求中文乱码处理

📌 图片解析

在初始化配置类中添加过滤器:

java 复制代码
@Override
protected Filter[] getServletFilters() {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);
    return new Filter[]{filter};
}

📌 作用

  • 在请求进入 Controller 之前统一设置编码
  • 解决 POST 请求中文乱码问题

六、非 JSON 格式请求参数处理

1️⃣ 参数名不一致的情况

📌 图片解析

java 复制代码
@RequestMapping("/save")
public void save(@RequestParam("username") String name) {}

请求参数:

复制代码
username=zhangsan

📌 作用

  • 建立请求参数与方法参数的映射关系

2️⃣ 数组参数绑定

📌 图片解析

java 复制代码
@RequestParam("hobby") String[] hobbies

请求示例:

复制代码
hobby=java&hobby=python

Spring MVC 自动封装为数组类型。


七、JSON 格式请求参数处理

1️⃣ 添加 JSON 转换依赖

📌 图片解析

在 pom.xml 中添加 Jackson 依赖,用于 JSON 与 Java 对象之间的转换。


2️⃣ 请求数据必须是 JSON

json 复制代码
{
  "name": "zhangsan",
  "age": 18
}

请求头中需要声明 JSON 类型。


3️⃣ 启用 JSON 自动转换

📌 图片解析

java 复制代码
@EnableWebMvc

该注解用于启用 Spring MVC 的核心功能,包括消息转换器。


4️⃣ Controller 方法接收 JSON

📌 图片解析

java 复制代码
@PostMapping("/save")
public void save(@RequestBody User user) {}

Spring MVC 会自动将 JSON 数据转换为 Java 对象。


5️⃣ 使用时的注意点

  • 请求体必须是 JSON 格式
  • JSON 的结构必须与 Java 对象属性一致

八、@RequestParam 与 @RequestBody 的区别

📌 图片解析总结

注解 数据来源 使用场景
@RequestParam 请求参数 表单、URL 参数
@RequestBody 请求体 JSON 数据

📌 记忆口诀

表单参数用 @RequestParam

JSON 数据用 @RequestBody


九、日期类型的参数传递

📌 图片解析

图片中展示的是 Controller 方法直接接收日期类型参数 的场景。


1️⃣ 问题背景

当前端传递日期字符串时,例如:

复制代码
birth=2023-10-01

Spring MVC 默认无法自动将字符串转换为日期类型。


2️⃣ 解决方案

在 Controller 方法参数上使用注解指定日期格式:

java 复制代码
@RequestMapping("/save")
public void save(
    @DateTimeFormat(pattern = "yyyy-MM-dd") Date birth
) {}

3️⃣ 工作原理

  • Spring MVC 在参数绑定阶段
  • 根据指定的日期格式
  • 将字符串转换为 Date 对象

4️⃣ 使用场景总结

  • 表单提交日期
  • URL 传递日期参数
  • 日期格式与 Java 类型不一致时

十、总结

  • Spring MVC 通过 DispatcherServlet 统一接管请求
  • 利用双容器机制解耦 Web 与业务
  • 使用注解完成路径映射与参数绑定
  • 通过 Jackson 实现 JSON 自动转换
  • 借助格式化注解完成日期类型转换
相关推荐
廋到被风吹走14 小时前
【Java】【JVM】垃圾回收深度解析:G1/ZGC/Shenandoah原理、日志分析与STW优化
java·开发语言·jvm
xrkhy14 小时前
Java全栈面试题及答案汇总(3)
java·开发语言·面试
SunnyDays101114 小时前
Java 高效实现 CSV 转 PDF
java·csv转pdf
隐形喷火龙14 小时前
SpringBoot 异步任务持久化方案:崩溃重启不丢任务的完整实现
java·spring boot·后端
我是koten14 小时前
K8s启动pod失败,日志报非法的Jar包排查思路(Invalid or corrupt jarfile /app/xxxx,jar)
java·docker·容器·kubernetes·bash·jar·shell
、BeYourself14 小时前
PGvector :在 Spring AI 中实现向量数据库存储与相似性搜索
数据库·人工智能·spring·springai
WX-bisheyuange14 小时前
基于Spring Boot的库存管理系统的设计与实现
java·spring boot·后端
消失的旧时光-194314 小时前
Freezed + json_serializable:DTO / Domain 分层与不可变模型(入门到落地)-----上篇
flutter·json·dto·domain
YanDDDeat14 小时前
【JVM】类初始化和加载
java·开发语言·jvm·后端