上一节课的内容:Spring MVC 讲解:从初始化流程到请求参数与 JSON 处理全解析

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

1. Spring MVC 中的响应 —— @ResponseBody 与 JSON 转换
2. REST 风格(RESTful)
3. 使用 RESTful 进行开发
4. 注解简化(Spring MVC 新特性)
5. 静态资源放行
6. 全局异常处理 —— @RestControllerAdvice
7. 拦截器(Interceptor)


一、Spring MVC 中的响应 —— @ResponseBody 与 JSON 转换

1️⃣ @ResponseBody 的核心作用

在这里插入图片描述

将 Controller 方法的返回值,直接写入 HTTP 响应体中

  • 默认情况下:

    • Controller 返回的是 视图名(JSP / HTML)
  • 使用 @ResponseBody 后:

    • 返回值 不再走视图解析器
    • 而是 作为数据直接返回给前端

📌 典型场景
前后端分离、Ajax 请求、REST 接口

@ResponseBody
@GetMapping("/user")
public User getUser() {
    return new User(1, "张三");
}

返回给前端的是 JSON 数据

{
  "id": 1,
  "name": "张三"
}

2️⃣ 对象 → JSON 是如何完成的?

👉 核心机制:HttpMessageConverter

在这里插入图片描述

Spring MVC 并不是"自动会转 JSON",而是靠:

HttpMessageConverter 接口

工作流程:

  1. 请求到达 Controller
  2. 方法标注 @ResponseBody
  3. Spring 查找合适的 HttpMessageConverter
  4. 将 Java 对象 → JSON
  5. 写入 Response Body

常见的 Converter:

Converter 作用
MappingJackson2HttpMessageConverter Java ↔ JSON
StringHttpMessageConverter String
FormHttpMessageConverter 表单

📌 Jackson 是事实标准
Spring Boot 默认集成,无需额外配置


二、REST 风格(RESTful)

1️⃣ 什么是 REST?

REST 是一种 基于资源的架构风格

核心思想:

  • 资源用 URL 表示
  • 操作用 HTTP 动词表示

❌ 传统风格:

/user/add
/user/delete

✅ REST 风格:

POST   /users
DELETE /users/1

2️⃣ REST 中的 HTTP 动词

动词 含义
GET 查询
POST 新增
PUT 修改(全量)
PATCH 修改(局部)
DELETE 删除

三、使用 RESTful 进行开发

1️⃣ 使用 method 指定请求方式

在这里插入图片描述

@RequestMapping(value = "/users", method = RequestMethod.POST)

表示:
👉 只有 POST 请求才能访问


2️⃣ 路径变量(Path Variable)

使用 {} 占位

在这里插入图片描述

@GetMapping("/users/{id}")
public User getUser(@PathVariable Integer id) {
    return userService.getById(id);
}
  • URL:/users/1
  • {id} 与参数名 id 必须一致

📌 REST 风格中:

  • 路径表示资源
  • 参数表示资源的唯一标识

3️⃣ 几种接收数据方式的区别(重点)

@RequestParam

@GetMapping("/users")
public User get(@RequestParam Integer id)
  • 参数来自:?id=1
  • 适合 查询条件

@PathVariable

@GetMapping("/users/{id}")
  • 参数在 URL 路径中
  • 适合 资源定位

@RequestBody

@PostMapping("/users")
public void save(@RequestBody User user)
  • 参数来自 JSON 请求体
  • 常用于 POST / PUT

📌 前端发送:

{
  "name": "张三",
  "age": 20
}

④总结

在这里插入图片描述


四、注解简化(Spring MVC 新特性)

1️⃣ @RestController

@RestController
public class UserController {
}

等价于:

@Controller
@ResponseBody

📌 专门为 REST 接口设计


2️⃣ 简化请求方式注解

原写法 简化写法
@RequestMapping(method = GET) @GetMapping
@RequestMapping(method = POST) @PostMapping
@RequestMapping(method = PUT) @PutMapping
@RequestMapping(method = DELETE) @DeleteMapping

五、静态资源放行

为什么要放行?

Spring MVC 默认:

  • 所有请求都会走 DispatcherServlet
  • 静态资源(css/js/img)会被拦截

解决方式:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/");
}

📌 Spring Boot 默认已配置好 /static/public


六、全局异常处理 —— @RestControllerAdvice

1️⃣ 为什么需要统一异常处理?

❌ 不处理的后果:

  • 前端收到 500
  • 错误格式不统一
  • 无法区分业务异常 / 系统异常

2️⃣ @RestControllerAdvice

@RestControllerAdvice 用于全局统一处理 REST 接口中的异常,并自动返回 JSON 格式的错误响应。

在这里插入图片描述

特点:

  • 全局生效
  • 自动返回 JSON
  • 结合 @ExceptionHandler 使用
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e) {
        return Result.fail(e.getMessage());
    }
}

📌 等价于:

@ControllerAdvice
@ResponseBody

3️⃣ 项目异常分类

常见三类:

  1. 系统异常

    • 空指针
    • 数组越界
  2. 业务异常

    • 用户不存在
    • 库存不足
  3. 未知异常

    • 未预料错误

4️⃣ 推荐处理方案

  • 自定义业务异常类
  • 全局异常处理器统一封装返回值
throw new BusinessException("用户名已存在");

七、拦截器(Interceptor)

1️⃣ 概念

在这里插入图片描述

在请求到达 Controller 前后进行拦截处理

📌 常见用途:

  • 登录校验
  • 权限控制
  • 日志记录
  • 性能监控

2️⃣ 拦截器 vs 过滤器

对比项 过滤器 拦截器
所属层 Servlet Spring MVC
拦截范围 所有请求 Controller
使用场景 通用处理 业务处理

过滤器是 Servlet 层面的组件,作用于所有请求;

拦截器是 Spring MVC 层面的组件,只拦截 Controller 请求。

过滤器更偏向通用处理,拦截器更偏向业务处理。


3️⃣ 拦截器执行流程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

简化后的开发流程:
在这里插入图片描述

三个核心方法:

preHandle()        // 前置
postHandle()       // 后置
afterCompletion()  // 完成后

执行顺序:

preHandle
Controller
postHandle
afterCompletion

4️⃣ 参数说明

🔹 preHandle

  • 返回 true:放行
  • 返回 false:拦截

📌 常用于 登录校验


🔹 postHandle

  • Controller 执行后
  • 视图渲染前

📌 可修改 ModelAndView


🔹 afterCompletion

  • 请求完全结束
  • 用于资源释放、日志

5️⃣ 多拦截器执行顺序(重点)

执行规则:

流程图展示:

在这里插入图片描述

  • 前置:顺序执行
  • 后置 / 完成:逆序执行

假设:

interceptor1
interceptor2

执行顺序:

interceptor1.pre
interceptor2.pre
Controller
interceptor2.post
interceptor1.post
interceptor2.after
interceptor1.after

总结为:
在这里插入图片描述

📌 类似 栈结构(先进后出)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐