Spring MVC处理流程与机制解析

 更新时间:2026年02月14日 15:22:25   作者:晔子yy  
这篇文章主要介绍了Spring MVC处理流程与机制,Spring MVC是Spring Framework的一个核心模块,是一个基于MVC设计模式的优秀Web框架,它本质上是Spring框架在Web应用领域的延伸,需要的朋友可以参考下

1.SpringMVC介绍

Spring MVC 是 Spring Framework 的一个核心模块,是一个基于 MVC 设计模式​ 的优秀 Web 框架。它本质上是 Spring 框架在 Web 应用领域的延伸,旨在简化基于 MVC 架构的 Web 应用程序开发。MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。

  • 模型(model)代表应用程序的核心数据和业务规则。它专注于处理什么数据和数据如何变化。
  • 视图(view):负责与用户直接交互的界面部分。它专注于如何展示数据和接收用户输入。
  • 控制器(controller):作为视图和模型之间的协调者。它接收用户的输入,决定使用哪个模型来处理,以及选择哪个视图来展示结果。

我们经常在项目中构建的基础三层架构(controller,service,mapper)就是在它们的基础之上所诞生的。

2.SpringMVC关键组件

1.DispatcherServlet(前端控制器)

前端控制器是一种设计模式,它提供了一个统一的入口点来处理所有的 Web 请求。在传统 Servlet 开发中,每个 URL 可能需要一个单独的 Servlet,而前端控制器模式用一个 Servlet 处理所有请求,然后分发到不同的处理器。Spring MVC 中就是 DispatcherServlet这个具体的实现。

职责:

  • 接收所有 HTTP 请求
  • 协调其他组件完成请求处理
  • 返回最终响应给客户端

DispatcherServlet可以说是整个SpringMVC的核心所在,它承担着从用户请求到用户接收的一整块处理链条的责任。

配置演示:

<!-- web.xml 配置 -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern> <!-- 拦截所有请求 -->
</servlet-mapping>

2.HandlerMapping(处理器映射器)

HandlerMapping 是一个策略接口,定义了如何根据 HTTP 请求找到对应的处理器(Handler)。它在 DispatcherServlet 和具体处理器之间建立桥梁。

职责:

  • 根据请求的 URL 路径,找到对应的处理器(Handler)
  • 维护请求路径与处理器的映射关系

常用实现:

  • RequestMappingHandlerMapping:处理 @RequestMapping注解(最常用)
  • BeanNameUrlHandlerMapping:根据 Bean 名称映射
  • SimpleUrlHandlerMapping:通过配置文件映射

大概说一下它的一个工作方式,我们假设有一个GET /users/list请求,HandlerMapping 查找映射表:"/users/list"就会转化成UserController.listUsers()给前端控制器。

3.HandlerAdapter(处理器适配器)

HandlerAdapter 是一个适配器接口,它让 DispatcherServlet 能够以统一的方式调用各种不同类型的处理器(Handler),而不需要关心处理器的具体实现。

职责:

  • 适配不同类型的处理器(Controller)
  • 统一调用处理器方法
  • 处理请求参数绑定和返回值处理

常用实现:

  • RequestMappingHandlerAdapter:处理 @Controller和 @RequestMapping
  • SimpleControllerHandlerAdapter:处理 Controller接口实现
  • HttpRequestHandlerAdapter:处理 HttpRequestHandler实现

HandlerAdapter会进行参数封装、数据格式转换、数据校验等操作

4.Handler处理器(Controller)

Handler处理器是 Spring MVC 的业务逻辑执行核心,是实际处理 HTTP 请求并返回响应的组件。

职责:

  • 执行具体的业务逻辑
  • 调用 Service 层处理业务
  • 准备模型数据
  • 返回视图信息

最常见的就是我们平时写的注解形式

@Controller
public class UserController {
    @GetMapping("/users")
    public String listUsers(Model model) {
        model.addAttribute("users", userService.findAll());
        return "userList";
    }
}

5.ViewResolver(视图解析器)

ViewResolver 是一个策略接口,用于解析控制器返回的视图名称,并返回一个用于渲染的 View 对象。它是 MVC 架构中视图层的重要桥梁。

职责:

  • 将 Controller 返回的逻辑视图名解析为实际的 View 对象
  • 支持多种视图技术(JSP、Thymeleaf、FreeMarker等)

常用实现:

  • InternalResourceViewResolver:用于 JSP(最常用)
  • ThymeleafViewResolver:用于 Thymeleaf
  • FreeMarkerViewResolver:用于 FreeMarker
  • BeanNameViewResolver:根据 Bean 名称解析

一个基础的视图解析器配置类如下:

@Configuration
public class WebConfig {
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

简单说一下流程:

1.Handler处理器返回: "user/list"

2.InternalResourceViewResolver 解析:

    前缀: "/WEB-INF/views/"

    视图名: "user/list"

    后缀: ".jsp"

实际路径: "/WEB-INF/views/user/list.jsp"

3.最后创建 InternalResourceView 对象返回

6.View(视图)

View 是一个渲染接口,负责将模型数据渲染成最终的响应格式(HTML、JSON、XML、PDF、Excel等)。它是用户界面的最终呈现者。

职责:

  • 将模型数据渲染成最终响应(通常是 HTML)
  • 支持不同的视图技术

3.SpringMVC处理流程

说完SpringMVC的一些关键组件,我们来看看这些组件到底是如何相互配合,完成从请求到接收数据的过程。

1.用户发送请求至前端控制器 DispatcherServlet​

2.DispatcherServlet 收到请求调用处理器映射器 HandlerMapping​

3.处理器映射器根据请求 URL 找到具体的处理器,生成处理器执行链 HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给 DispatcherServlet​

4.DispatcherServlet 根据处理器 Handler 获取处理器适配器 HandlerAdapter 执行 HandlerAdapter 处理一系列的操作,如:参数封装、数据格式转换、数据验证等操作​

5.执行处理器 Handler(Controller,也叫页面控制器)​

6.Handler 执行完成返回 ModelAndView​

7.HandlerAdapter 将 Handler 执行结果 ModelAndView 返回到 DispatcherServlet​

8.DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器​

9.ViewResolver 解析后返回具体 View​

10.DispatcherServlet 对 View 进行渲染视图(即将模型数据 model 填充至视图中)​

11.DispatcherServlet 响应用户

4.SpringMVC的主要优势

1.与 Spring 无缝集成:可以充分利用 Spring 的 IOC(控制反转)和 AOP(面向切面编程)特性,方便地进行依赖注入和事务管理。

2.高度可配置:几乎所有组件都可以通过配置文件(XML)或注解进行定制和扩展

3.常用强大注解:

  • @Controller:标记一个类为控制器。
  • @RequestMapping:将 URL 映射到处理方法。
  • @RequestParam, @PathVariable:绑定请求参数和路径变量。
  • @RequestBody, @ResponseBody:支持 RESTful 风格的 JSON/XML 数据绑定。

4.灵活的视图技术:支持 JSP、Thymeleaf、FreeMarker、Velocity、PDF、Excel 等多种视图技术。

5.拦截器:提供 HandlerInterceptor接口,允许在请求处理前后执行通用逻辑(如权限检查、日志记录),功能类似于过滤器但更精细。

以上就是Spring MVC处理流程与机制解析的详细内容,更多关于Spring MVC处理流程的资料请关注脚本之家其它相关文章!

相关文章

  • java并发容器ConcurrentHashMap深入分析

    java并发容器ConcurrentHashMap深入分析

    这篇文章主要为大家介绍了java并发容器ConcurrentHashMap使用示例及深入分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 基于SpringMVC入门案例及讲解

    基于SpringMVC入门案例及讲解

    这篇文章主要介绍了基于SpringMVC入门案例及讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringBoot基于Redis的分布式锁实现过程记录

    SpringBoot基于Redis的分布式锁实现过程记录

    Redis是一套 key-value 高性能数据库,使用它可以大大提高我们的开发效率,在SpringBoot中,自动配置也帮我们节约了大量的配置,下面这篇文章主要给大家介绍了关于SpringBoot基于Redis的分布式锁实现的相关资料,需要的朋友可以参考下
    2022-01-01
  • 详解MyBatis逆向工程

    详解MyBatis逆向工程

    本篇文章主要介绍了详解MyBatis逆向工程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 在IDEA中使用debug工具去运行java程序的实现步骤

    在IDEA中使用debug工具去运行java程序的实现步骤

    调试工具(debug工具)是一种用于帮助程序员识别和修复程序中的错误的工具,它们提供了一系列的功能,帮助程序员在代码执行的过程中跟踪和检测问题,本文将给大家介绍使用debug工具去运行java程序的实现步骤,需要的朋友可以参考下
    2024-04-04
  • java计算值所占的百分比,结果为100%问题

    java计算值所占的百分比,结果为100%问题

    这篇文章主要介绍了java计算值所占的百分比,结果为100%问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • cookie+mybatis+servlet实现免登录时长两天半的整体流程

    cookie+mybatis+servlet实现免登录时长两天半的整体流程

    这篇文章主要介绍了cookie+mybatis+servlet实现免登录时长两天半,主要用到的技术有session、cookie、转发、重定向、filter、和servlet,最重要的还是具体的来运用它们在前端页面真正的搭建出一个应用,通过这个练习,对我们所学的web知识做一个整合,需要的朋友可以参考下
    2022-10-10
  • Java 3D入门之基本图形功能 附源码

    Java 3D入门之基本图形功能 附源码

    Java3D API是Sun定义的用于实现3D显示的接口。3D技术是底层的显示技术,Java3D提供了基于Java的上层接口。Java3D把OpenGL和DirectX这些底层技术包装在Java接口中。这种全新的设计使3D技术变得不再繁琐且可以加入到J2SE、J2EE的整套架构,故保证了Java3D技术强大的扩展性
    2021-10-10
  • 如何用Java模拟XN*2图灵机

    如何用Java模拟XN*2图灵机

    这篇文章主要介绍了如何用Java模拟XN*2图灵机方法,感兴趣的朋友可以参考下
    2021-04-04
  • Java基础教程之static五大应用场景

    Java基础教程之static五大应用场景

    这篇文章主要给大家介绍了关于Java基础教程之static五大应用场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论