一、Spring MVC 核心知识解析
- 核心组件:
- DispatcherServlet(核心控制器):本质是 Servlet,负责接收所有请求并分发到对应的处理器,是 Spring MVC 的 “中央调度器”,降低了组件间的耦合度。
- HandlerMapping(处理器映射器):根据请求的 URL 匹配对应的 Handler(即 Controller 中的方法),并返回处理器对象及拦截器(如有)。
- HandlerAdapter(处理器适配器):执行 HandlerMapping 找到的处理器(Controller 方法),并将结果封装为 ModelAndView 返回。
- Handler(处理器):即我们编写的 Controller 中的业务方法,负责处理具体请求。
- ViewResolver(视图解析器):将 ModelAndView 中的逻辑视图名解析为实际视图(如 JSP),但前后端分离模式下基本不用。
- 这些组件中,只有 Handler 需要我们开发,其他组件由 Spring 框架提供,Spring Boot 已自动配置,无需手动设置。
- 请求执行流程:
- 用户发送请求到 DispatcherServlet。
- DispatcherServlet 调用 HandlerMapping,获取能处理请求的 Handler 及拦截器,返回给 DispatcherServlet。
- DispatcherServlet 通过 HandlerAdapter 执行 Handler(Controller 方法),得到 ModelAndView。
- DispatcherServlet 将 ModelAndView 传给 ViewResolver,解析为实际 View。
- DispatcherServlet 渲染 View(填充模型数据)。
- 响应结果给用户。
- 拦截器的使用与区别:
- 应用场景:登录校验、参数转换、数据脱敏等。使用步骤:
- 定义类实现
HandlerInterceptor接口,重写preHandle(执行前)、postHandle(执行后)、afterCompletion(完成后)方法。 - 定义配置类实现
WebMvcConfigurer,通过addInterceptors方法配置拦截路径和排除路径。
- 与过滤器(Filter)的区别:
- 接口规范:拦截器实现
HandlerInterceptor,过滤器实现Filter。 - 拦截范围:过滤器拦截 Web 服务器所有资源(如静态资源、Servlet),拦截器仅拦截 Spring 环境中的资源(主要是 Controller)。
- 实现机制:过滤器基于函数回调,拦截器基于反射(AOP 思想)。两者功能有重叠,可根据场景选择。
- 异常处理:通过全局异常处理器统一处理异常,无需在 Controller、Service 中单独处理。实现方式:
- 定义类并添加
@RestControllerAdvice注解(组合了@ControllerAdvice和@ResponseBody)。 - 在方法上添加
@ExceptionHandler注解,指定处理的异常类型(如@ExceptionHandler(Exception.class)处理所有异常),可针对不同异常定义多个处理方法,返回统一的错误信息。
- 常用注解:
@RequestMapping:映射请求路径,可用于类(指定父路径)和方法,通过method属性限定请求方式(衍生出@GetMapping、@PostMapping等)。@RequestBody:接收请求体中的 JSON 数据,自动转换为 Java 对象。@RequestParam:绑定请求参数,解决参数名与方法形参不一致的问题,可设置默认值(如@RequestParam(defaultValue = "1") int page)。@PathVariable:从 URL 路径中获取参数(如/user/{id}中的id),绑定到方法形参。@ResponseBody:将方法返回值直接作为响应体,对象 / 集合会自动转为 JSON。@RequestHeader:获取指定的请求头信息(如@RequestHeader("token") String token)。