Spring MVC 核心组件与请求处理机制详解

简介: 本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别

一、Spring MVC 核心知识解析

  1. 核心组件:
  • DispatcherServlet(核心控制器):本质是 Servlet,负责接收所有请求并分发到对应的处理器,是 Spring MVC 的 “中央调度器”,降低了组件间的耦合度。
  • HandlerMapping(处理器映射器):根据请求的 URL 匹配对应的 Handler(即 Controller 中的方法),并返回处理器对象及拦截器(如有)。
  • HandlerAdapter(处理器适配器):执行 HandlerMapping 找到的处理器(Controller 方法),并将结果封装为 ModelAndView 返回。
  • Handler(处理器):即我们编写的 Controller 中的业务方法,负责处理具体请求。
  • ViewResolver(视图解析器):将 ModelAndView 中的逻辑视图名解析为实际视图(如 JSP),但前后端分离模式下基本不用。
  1. 这些组件中,只有 Handler 需要我们开发,其他组件由 Spring 框架提供,Spring Boot 已自动配置,无需手动设置。
  2. 请求执行流程:
  1. 用户发送请求到 DispatcherServlet。
  2. DispatcherServlet 调用 HandlerMapping,获取能处理请求的 Handler 及拦截器,返回给 DispatcherServlet。
  3. DispatcherServlet 通过 HandlerAdapter 执行 Handler(Controller 方法),得到 ModelAndView。
  4. DispatcherServlet 将 ModelAndView 传给 ViewResolver,解析为实际 View。
  5. DispatcherServlet 渲染 View(填充模型数据)。
  6. 响应结果给用户。
  1. 拦截器的使用与区别:
  • 应用场景:登录校验、参数转换、数据脱敏等。使用步骤:
  1. 定义类实现HandlerInterceptor接口,重写preHandle(执行前)、postHandle(执行后)、afterCompletion(完成后)方法。
  2. 定义配置类实现WebMvcConfigurer,通过addInterceptors方法配置拦截路径和排除路径。
  • 与过滤器(Filter)的区别:
  • 接口规范:拦截器实现HandlerInterceptor,过滤器实现Filter。
  • 拦截范围:过滤器拦截 Web 服务器所有资源(如静态资源、Servlet),拦截器仅拦截 Spring 环境中的资源(主要是 Controller)。
  • 实现机制:过滤器基于函数回调,拦截器基于反射(AOP 思想)。两者功能有重叠,可根据场景选择。
  1. 异常处理:通过全局异常处理器统一处理异常,无需在 Controller、Service 中单独处理。实现方式:
  • 定义类并添加@RestControllerAdvice注解(组合了@ControllerAdvice和@ResponseBody)。
  • 在方法上添加@ExceptionHandler注解,指定处理的异常类型(如@ExceptionHandler(Exception.class)处理所有异常),可针对不同异常定义多个处理方法,返回统一的错误信息。
  1. 常用注解:
  • @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)。
相关文章
|
人工智能 JSON 安全
Spring Boot实现无感刷新Token机制
本文深入解析在Spring Boot项目中实现JWT无感刷新Token的机制,涵盖双Token策略、Refresh Token安全性及具体示例代码,帮助开发者提升用户体验与系统安全性。
1434 4
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
1605 4
|
负载均衡 Java Nacos
Spring Cloud五大组件
Spring Cloud五大组件
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
597 0
|
12月前
|
缓存 监控 Java
《深入理解Spring》拦截器(Interceptor)——请求处理的艺术
Spring拦截器是Web开发中实现横切关注点的核心组件,基于AOP思想,可在请求处理前后执行日志记录、身份验证、权限控制等通用逻辑。相比Servlet过滤器,拦截器更贴近Spring容器,能访问Bean和上下文,适用于Controller级精细控制。通过实现`HandlerInterceptor`接口的`preHandle`、`postHandle`和`afterCompletion`方法,可灵活控制请求流程。结合配置类注册并设置路径匹配与执行顺序,实现高效复用与维护。常用于认证鉴权、性能监控、统一异常处理等场景,提升应用安全性与可维护性。
|
12月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
XML Java Maven
Spring 手动实现Spring底层机制
Spring 第六节 手动实现Spring底层机制 万字详解!
661 32
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
1324 5
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
2676 15
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
1000 11