Spring MVC 中 RESTful 开发核心技术详解(响应处理、异常机制与拦截器)(黑马网课ssm笔记总结)(day6)
📚 目录(点击跳转对应章节)
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 接口
工作流程:
- 请求到达 Controller
- 方法标注
@ResponseBody - Spring 查找合适的
HttpMessageConverter - 将 Java 对象 → JSON
- 写入 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️⃣ 项目异常分类
常见三类:
-
系统异常
- 空指针
- 数组越界
-
业务异常
- 用户不存在
- 库存不足
-
未知异常
- 未预料错误
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
总结为:
📌 类似 栈结构(先进后出)
更多推荐





所有评论(0)