Spring MVC 核心知识

下面按面试 / 实战 都高频的维度,把 Spring MVC 核心知识 系统梳理一遍,覆盖原理 + 关键组件 + 常考点


一、Spring MVC 是什么

Spring MVC 是 Spring Framework 提供的一个 基于 MVC 设计模式的 Web 框架 ,用于构建 基于 HTTP/REST 的服务端应用

核心目标:

  • 请求 → 控制器 → 业务 → 视图 / JSON
  • 解耦 请求处理、业务逻辑、视图渲染
  • 与 Spring IoC / AOP 深度整合

二、核心架构 & 请求流程(必考)

请求完整执行流程

  1. 客户端请求DispatcherServlet

  2. DispatcherServletHandlerMapping

  3. 找到对应的 Controller + Method

  4. HandlerAdapter 调用 Controller 方法

  5. 执行:

    • 参数绑定
    • 数据校验
  6. 返回:

    • ModelAndView
    • 或直接返回 JSON
  7. ViewResolver 解析视图(如 JSP / Thymeleaf)

  8. 响应客户端

一句话总结

DispatcherServlet 是 Spring MVC 的"中央调度器"。


三、核心组件(重点背)

1. DispatcherServlet(核心)

  • 前端控制器

  • 所有请求的统一入口

  • 负责:

    • 请求分发
    • 组件协调
    • 异常处理

2. HandlerMapping(映射器)

作用: 请求 URL → Controller 方法

常见实现:

  • RequestMappingHandlerMapping(最常用)
  • SimpleUrlHandlerMapping

3. HandlerAdapter(适配器)

作用: 真正调用 Controller 方法

为什么要有 Adapter?

Controller 形式不统一,需要适配调用方式

常见实现:

  • RequestMappingHandlerAdapter

4. Controller(控制器)

  • 使用 @Controller / @RestController

  • 处理请求,调用 Service

  • 返回:

    • 视图名
    • JSON 数据

5. ViewResolver(视图解析器)

  • 逻辑视图名 → 实际视图

  • 常见:

    • InternalResourceViewResolver(JSP)
    • ThymeleafViewResolver

前后端分离项目中几乎不用


四、常用核心注解(面试必问)

1. 请求映射类

注解 作用
@RequestMapping 通用映射
@GetMapping GET
@PostMapping POST
@PutMapping PUT
@DeleteMapping DELETE
java 复制代码
@GetMapping("/users/{id}")
public User get(@PathVariable Long id) { }

2. 参数绑定类

注解 作用
@RequestParam URL 参数
@PathVariable 路径变量
@RequestBody JSON → 对象
@RequestHeader 请求头
@CookieValue Cookie

3. 返回值相关

注解 作用
@ResponseBody 返回 JSON
@RestController = Controller + ResponseBody

五、参数绑定 & 数据转换(高频)

1. 参数绑定原理

  • 基于 JavaBean 规范

  • 通过 反射 + Setter

  • 支持:

    • 基本类型
    • 对象
    • List / Map
java 复制代码
@PostMapping("/add")
public void add(User user) { }

2. 类型转换

  • 内置 Converter
  • 日期格式处理:
java 复制代码
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;

六、数据校验(@Valid)

1. JSR-303 校验

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

常用注解:

注解 说明
@NotNull 非空
@NotBlank 非空字符串
@Size 长度
@Min / @Max 数值范围
@Email 邮箱

七、异常处理机制(必考)

1. @ExceptionHandler(局部)

java 复制代码
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Result error(Exception e) { }

2. @ControllerAdvice(全局,推荐)

java 复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {

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

企业项目标配


八、拦截器 Interceptor(对比 Filter)

1. 执行时机

方法 说明
preHandle 进入 Controller 前
postHandle Controller 后,视图前
afterCompletion 请求完成

2. Filter vs Interceptor

对比项 Filter Interceptor
规范 Servlet Spring
作用范围 所有请求 Controller
注入 Bean
推荐使用

九、Spring MVC 与 Spring Boot 的关系

  • Spring Boot 内置并自动配置 Spring MVC

  • 无需:

    • web.xml
    • DispatcherServlet 配置
  • 核心仍然是 Spring MVC

java 复制代码
@SpringBootApplication

十、Spring MVC 高频面试题速答

Q1:DispatcherServlet 作用?

前端控制器,统一请求入口

Q2:@Controller 和 @RestController 区别?

RestController = Controller + ResponseBody

Q3:参数是如何绑定的?

反射 + JavaBean + 数据绑定器

Q4:Spring MVC 如何处理异常?

@ExceptionHandler + @ControllerAdvice

Q5:Interceptor 用途?

登录校验、权限、日志、性能统计

相关推荐
存在的五月雨几秒前
uniapp 一些组件的使用
java·前端·uni-app
我命由我123452 分钟前
Kotlin 开发 - 双冒号操作符(引用顶层函数、引用成员函数、引用构造函数、引用属性、引用类)
android·java·开发语言·kotlin·android studio·android jetpack·android-studio
佳xuan4 分钟前
QA与RAG检索
java·服务器·前端
半瓶榴莲奶^_^3 小时前
jvm java虚拟机
java·jvm
invicinble9 小时前
这里对java的知识体系做一个全域的介绍
java·开发语言·python
wbs_scy9 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·开发语言
ss2739 小时前
食谱推荐系统功能测试如何写?
java·数据库·spring boot·功能测试
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
try2find10 小时前
打印ascii码报错问题
java·linux·前端
014-code10 小时前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库