解读Spring MVC的工作流程

 更新时间:2025年01月21日 14:46:49   作者:qq_44199605  
SpringMVC的工作流程是基于模型-视图-控制器(MVC)设计模式的一个典型实现,主要包括用户发送请求到前端控制器(DispatcherServlet)、前端控制器转发请求给处理器映射器(HandlerMapping)

Spring MVC 的工作流程是基于模型-视图-控制器(MVC)设计模式的一个典型实现,以下是其主要工作流程步骤:

Spring MVC 的工作流程

客户端请求发送到前端控制器(DispatcherServlet)

  • 用户通过浏览器发送请求,该请求首先到达 Spring MVC 的前端控制器 DispatcherServlet
  • 这个类是整个流程的核心,它负责协调其他组件的执行。

前端控制器转发请求给处理器映射器(Handler Mapping)

  • DispatcherServlet 接收到请求后,依据请求的 URL 查找相应的处理器(Controller)来处理请求。
  • 这个映射由 Handler Mapping 完成,它根据配置查找具体的处理器。

处理器映射器找到相应的控制器(Controller)

  • Handler Mapping 根据请求的路径,确定使用哪个 Controller 来处理请求。
  • 找到之后,它返回 Controller 的信息给 DispatcherServlet

前端控制器调用目标处理器(Controller)

  • DispatcherServlet 根据 Handler Mapping 提供的信息,调用具体的 Controller 处理请求。
  • 控制器中的业务逻辑会处理客户端的数据,并返回一个 ModelAndView 对象,包含了模型数据和视图名称。

控制器返回模型数据和视图名称

  • Controller 将处理后的模型数据和视图名称返回给 DispatcherServlet

前端控制器请求视图解析器(View Resolver)

  • DispatcherServlet 将视图名称交给视图解析器 View Resolver
  • 由它负责将视图名称解析为具体的视图(比如 JSP、Thymeleaf 等)

视图解析器生成视图

  • 视图解析器会根据配置找到相应的物理视图文件
  • 并返回给 DispatcherServlet

前端控制器将模型数据传递给视图

  • DispatcherServlet 将控制器返回的模型数据传递给解析出来的视图
  • 通常这些数据会通过 ModelModelAndView 对象传递

视图渲染

  • 视图结合模型数据进行渲染
  • 生成最终的 HTML 页面

前端控制器响应客户端

  • 渲染后的视图由 DispatcherServlet 返回给客户端(浏览器)
  • 最终用户看到的是处理后的页面内容

例子

假设我们有一个简单的 Web 应用程序,用于显示用户的个人信息。当用户访问 /user/1 这个 URL 时,应用程序会展示 ID 为 1 的用户信息。

详细步骤

用户发送请求到服务器: 用户在浏览器中输入 URL /user/1,比如 http://localhost:8080/user/1,这个请求被发送到服务器。

前端控制器(DispatcherServlet)接收请求: Spring MVC 的核心组件 DispatcherServlet 会拦截所有进入的 HTTP 请求。它相当于请求的入口点,负责将请求分发到适当的处理器(Controller)。

  • 例子中的请求路径 /user/1DispatcherServlet 拦截,准备分配给相应的处理器。

通过处理器映射器(Handler Mapping)查找控制器DispatcherServlet 使用处理器映射器(HandlerMapping)查找合适的控制器来处理 /user/1 请求。这个映射过程通常是根据 URL 路径来匹配的。

  • 例如,@RequestMapping("/user/{id}") 注解可以告诉 Spring 这个方法负责处理 /user/{id} 的请求。
  • 在我们的例子中,处理器映射器会找到 UserController,该控制器负责处理所有与用户相关的请求。

控制器(Controller)处理请求: 找到合适的控制器后,DispatcherServlet 将请求转发给控制器。控制器包含了应用程序的业务逻辑,负责处理用户请求和返回数据。

  • 在这个例子中,UserController 的方法会接受用户的 ID(比如 1),然后从数据库或内存中获取 ID 为 1 的用户信息。
@Controller
public class UserController {
    @RequestMapping("/user/{id}")
    public ModelAndView getUser(@PathVariable("id") int userId) {
        // 模拟从数据库获取用户数据
        User user = userService.getUserById(userId);
        ModelAndView mav = new ModelAndView("userView");
        mav.addObject("user", user);
        return mav;
    }
}

在这个例子中:

  • getUser 方法会从 userService 获取用户数据,并将该数据存储在 ModelAndView 对象中,返回给 DispatcherServlet
  • "userView" 是视图的名称,Spring MVC 会根据这个名称来找到合适的视图模板(比如 JSP 页面、Thymeleaf 页面等)。
  • mav.addObject("user", user) 将用户信息存储在模型中,供视图使用。

返回模型和视图给 DispatcherServlet: 控制器方法返回一个 ModelAndView 对象,包含了模型数据(用户信息)和视图名称(userView)。DispatcherServlet 接收这个返回对象。

通过视图解析器(View Resolver)查找视图DispatcherServlet 会将视图名称(如 "userView")交给视图解析器(ViewResolver),由它根据配置找到物理视图文件。

视图解析器生成视图: 视图解析器会找到 userView.jsp 并返回给 DispatcherServlet。此时,视图还没有渲染出用户数据,只是找到了物理文件。

前端控制器将模型数据传递给视图DispatcherServlet 将控制器返回的用户数据(模型)传递给 userView.jsp 视图。视图文件会使用这些数据生成动态的 HTML 页面。

视图渲染: 视图(userView.jsp)结合模型数据进行渲染。比如 JSP 文件中可能会使用表达式 ${user.name} 来显示用户的姓名。

返回响应到客户端: 渲染后的 HTML 页面被返回给客户端(用户的浏览器)。用户最终看到的是包含用户信息的完整页面。

注:

  • 在使用 Spring Boot 进行前后端分离开发时,后端只负责提供数据接口(通常以 RESTful API 的形式),前端负责渲染页面和处理用户交互。
  • 这种架构在 Spring Boot 中表现为 RESTful API,而不再像传统 Spring MVC 那样返回视图。
  • 与传统 MVC 不同,Controller 使用 @RestController,直接返回 Java 对象,而不返回视图。
  • Spring Boot 会自动将返回的对象序列化为 JSON 或 XML。
@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") int id) {
        // 从服务层获取用户信息
        return userService.getUserById(id); // 返回的是 User 对象,而不是视图名称
    }
}

传统 Spring MVC 返回视图

  • 返回的是视图文件(如 JSP 页面)通过服务端渲染动态 HTML。
  • 控制器返回 ModelAndView 对象,包含视图名称和模型数据。
  • 使用 JSP、Thymeleaf 等视图引擎渲染视图。

Spring Boot RESTful API

  • 返回的是 JSON 或 XML 格式的数据,由前端或客户端负责渲染。
  • 使用 @RestController,控制器直接返回对象,Spring Boot 自动将其转换为 JSON。

总结

Spring MVC 的整个流程可以简单总结为以下几个步骤:

  1. 用户发送请求到 DispatcherServlet
  2. DispatcherServlet 使用 HandlerMapping 查找对应的控制器。
  3. 控制器处理请求,生成 ModelAndView
  4. DispatcherServlet 使用 ViewResolver 解析视图名称。
  5. 将模型数据传递给视图进行渲染。
  6. 将渲染的视图返回给用户。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot集成和使用RabbitMQ方式

    SpringBoot集成和使用RabbitMQ方式

    本文介绍了如何在SpringBoot项目中集成RabbitMQ,并结合死信队列实现延时消息,通过这些配置和机制,开发者可以在分布式系统中构建更为灵活和可靠的消息传递系统
    2024-12-12
  • Java接口请求重试机制的几种常见方法

    Java接口请求重试机制的几种常见方法

    Java接口请求重试机制是保证系统稳定性和容错能力的重要手段之一,当接口请求发生失败或暂时性错误时,通过重试机制可以提高请求的成功率,本文将详细介绍Java接口请求重试机制的几种常见方法,需要的朋友可以参考下
    2023-11-11
  • Java 图表类库详解

    Java 图表类库详解

    本文主要介绍了Java图表类库的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java实现简单猜数字小游戏

    Java实现简单猜数字小游戏

    这篇文章主要为大家详细介绍了Java实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Spring AOP底层源码详解

    Spring AOP底层源码详解

    这篇文章主要介绍了Spring AOP底层源码详解,帮助大家更好的理解和学习使用Spring AOP,感兴趣的朋友可以了解下
    2021-03-03
  • java.util.Random和concurrent.ThreadLocalRandom使用对比

    java.util.Random和concurrent.ThreadLocalRandom使用对比

    这篇文章主要介绍了java.util.Random和concurrent.ThreadLocalRandom使用对比,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 浅析java中密文的创建和校验

    浅析java中密文的创建和校验

    这篇文章主要为大家详细介绍了java中密文的创建和校验的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Java中的@builder建造者模式详细解析

    Java中的@builder建造者模式详细解析

    这篇文章主要介绍了Java中的@builder建造者模式详细解析,使用 @Builder 注解可以简化手动编写建造者模式的代码,使代码更加简洁易读,它可以自动生成链式调用的方法来设置对象的属性,并且可以在需要时进行可选属性的设置,需要的朋友可以参考下
    2024-01-01
  • spring cloud gateway 全局过滤器的实现

    spring cloud gateway 全局过滤器的实现

    全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,这篇文章主要介绍了spring cloud gateway 全局过滤器的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • SpringBoot使用minio及配置代码

    SpringBoot使用minio及配置代码

    MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。本文重点给大家介绍SpringBoot使用minio及配置代码,感兴趣的朋友一起看看吧
    2022-02-02

最新评论