Spring MVC 的请求处理流程是怎样的?

发布于:2025-04-07 ⋅ 阅读:(32) ⋅ 点赞:(0)

Spring MVC 请求处理流程的大致可分为以下几个步骤:

1. 请求到达 DispatcherServlet:

  • 所有请求首先到达 DispatcherServlet(前端控制器)。DispatcherServlet 是 Spring MVC 的核心,它负责接收请求,并将请求委派给其他组件进行处理。
  • DispatcherServlet 通常在 web.xml 中配置(或使用 Servlet 3.0+ 的 Java 配置),并映射到特定的 URL 模式(例如 /*.do)。

2. 查找 HandlerMapping:

  • DispatcherServlet 使用 HandlerMapping 来确定哪个控制器(Controller)应该处理当前请求。
  • HandlerMapping 根据请求的 URL、HTTP 方法、请求头等信息,查找匹配的 HandlerExecutionChain
    • HandlerExecutionChain 包含了一个处理器(Handler,通常是一个 Controller 方法)和一组拦截器(HandlerInterceptor)。
  • Spring MVC 提供了多种 HandlerMapping 实现:
    • BeanNameUrlHandlerMapping:根据 Bean 的名称与 URL 进行映射。
    • RequestMappingHandlerMapping:根据 @RequestMapping 注解进行映射(最常用)。
    • SimpleUrlHandlerMapping:通过配置文件进行 URL 映射。

3. 执行 HandlerAdapter:

  • 找到 HandlerExecutionChain 后,DispatcherServlet 使用 HandlerAdapter 来执行处理器(Handler)。
  • HandlerAdapter 负责调用 Controller 方法,并处理方法参数、返回值等。
  • Spring MVC 提供了多种 HandlerAdapter 实现:
    • HttpRequestHandlerAdapter:处理 HttpRequestHandler 类型的处理器。
    • SimpleControllerHandlerAdapter:处理 Controller 接口类型的处理器。
    • RequestMappingHandlerAdapter:处理带有 @RequestMapping 注解的方法(最常用)。
  • HandlerAdapter 的执行过程包括:
    1. 执行拦截器的 preHandle() 方法: 在调用 Controller 方法之前,执行所有拦截器的 preHandle() 方法。如果任何一个 preHandle() 方法返回 false,则请求处理流程终止。
    2. 解析方法参数: 根据方法参数上的注解(如 @RequestParam@PathVariable@RequestBody 等),从请求中获取参数值,并进行类型转换。
    3. 调用 Controller 方法: 使用反射调用 Controller 方法,并将解析后的参数值传入。
    4. 处理返回值: 根据方法返回值的类型和注解(如 @ResponseBody@ModelAndView 等),将返回值转换为合适的响应格式(如 JSON、HTML、XML 等)。
    5. 执行拦截器的 postHandle() 方法: 在 Controller 方法执行完成后,但在视图渲染之前,执行所有拦截器的 postHandle() 方法。
    6. **执行拦截器的 afterCompletion() 方法: ** 在整个请求完成后 (视图渲染后) 执行.

4. 返回 ModelAndView 或直接响应:

  • Controller 方法可以返回一个 ModelAndView 对象,其中包含了模型数据(Model)和视图名称(View Name)。
  • Controller 方法也可以直接通过 @ResponseBody 注解返回数据(如 JSON),或者通过 HttpServletResponse 对象直接写入响应内容。

5. 视图解析 (View Resolution):

  • 如果 Controller 方法返回的是 ModelAndViewDispatcherServlet 会使用 ViewResolver 将视图名称解析成一个 View 对象。
  • ViewResolver 根据视图名称和配置的视图解析规则,查找对应的视图模板文件(如 JSP、Thymeleaf、FreeMarker 等)。
  • Spring MVC 提供了多种 ViewResolver 实现:
    • InternalResourceViewResolver:用于解析 JSP 视图。
    • FreeMarkerViewResolver:用于解析 FreeMarker 视图。
    • ThymeleafViewResolver:用于解析 Thymeleaf 视图。

6. 视图渲染 (View Rendering):

  • DispatcherServlet 调用 View 对象的 render() 方法,将模型数据渲染到视图模板中,生成最终的 HTML 响应。
  • View 对象会使用相应的模板引擎(如 JSP 引擎、Thymeleaf 引擎等)来渲染视图。

7. 返回响应:

  • DispatcherServlet 将生成的 HTML 响应返回给客户端。

核心组件总结:

  • DispatcherServlet 前端控制器,负责接收请求,并将请求委派给其他组件。
  • HandlerMapping 处理器映射器,负责根据请求查找对应的处理器(Handler)。
  • HandlerAdapter 处理器适配器,负责执行处理器(Handler),并处理方法参数、返回值等。
  • HandlerInterceptor 拦截器,可以在请求处理前后执行自定义逻辑。
  • Controller 控制器,负责处理请求,并返回模型数据和视图名称。
  • ModelAndView 模型和视图对象,包含了模型数据和视图名称。
  • ViewResolver 视图解析器,负责将视图名称解析成 View 对象。
  • View 视图对象,负责将模型数据渲染到视图模板中。

流程图示:

Client --(Request)--> DispatcherServlet --(HandlerMapping)--> HandlerExecutionChain
                                                                  |
                                                                  --(HandlerAdapter)--> Controller --(ModelAndView)--> ViewResolver --(View)--> DispatcherServlet --(Response)--> Client
                                                                  |                                                                     ^
                                                                  |-----------------------------------------------------------------------|
                                                                                      HandlerInterceptor

总结:
Spring MVC 的请求处理流程是一个高度可定制和可扩展的流程。理解这个流程的各个步骤和核心组件,有助于我们更好地使用 Spring MVC 开发 Web 应用程序,并解决可能出现的问题。