当前位置: 首页 > news >正文

SpringMVC在前后端分离架构中的执行流程详解

SpringMVC在前后端分离架构中的执行流程详解

在前后端分离架构成为主流的今天,SpringMVC作为Java后端开发的核心框架,依然扮演着至关重要的角色。与传统JSP视图渲染的模式不同,前后端分离下的SpringMVC主要负责处理前端发送的RESTful API请求,通过JSON等数据格式与前端交互。本文将从底层原理到实际执行步骤,详细解析SpringMVC的执行流程,并结合前后端分离特点说明核心组件的作用。

一、SpringMVC核心角色与前后端分离适配

在前后端分离架构中,前端(如Vue/React/Angular)与后端通过HTTP协议+JSON数据格式通信,后端仅负责数据处理而不涉及视图渲染。SpringMVC通过以下核心组件实现这一模式:

  • DispatcherServlet:前端控制器,统一接收所有请求并调度其他组件
  • HandlerMapping:请求映射器,根据请求路径找到对应的处理器(Controller方法)
  • HandlerAdapter:处理器适配器,适配并执行找到的处理器
  • Controller:业务处理器,包含具体的业务逻辑(如调用Service层)
  • HandlerInterceptor:拦截器,用于请求预处理/后处理(如登录校验、日志记录)
  • HttpMessageConverter:消息转换器,负责请求参数(JSON→Java对象)和响应数据(Java对象→JSON)的转换
  • ModelAndView:在前后端分离中简化为"数据载体",通常通过@ResponseBody直接返回Java对象(由消息转换器转为JSON)

二、SpringMVC完整执行流程(前后端分离版)

以下是一个HTTP请求从前端发送到后端响应的完整流程,共12个核心步骤,每一步都标注了前后端分离场景下的特殊处理:

流程图概览

前端应用(Vue/React)→ HTTP请求 → DispatcherServlet → HandlerMapping → 拦截器(preHandle)→ HandlerAdapter → Controller方法 → 业务逻辑(Service)→ 返回Java对象 → 拦截器(postHandle)→ HttpMessageConverter(Java→JSON)→ 拦截器(afterCompletion)→ DispatcherServlet → HTTP响应(JSON)→ 前端应用

流程图

详细步骤解析

1. 前端发送HTTP请求

前端应用(如Vue)通过Axios等工具发送HTTP请求(GET/POST等),例如:

// 前端调用示例
axios.post("/api/user/login", {username: "admin", password: "123"}).then(response => { /* 处理响应 */ })

请求包含URL路径(/api/user/login)、请求方法(POST)、请求体(JSON格式的用户名密码)等信息。

2. 请求到达DispatcherServlet

所有请求首先进入DispatcherServlet(web.xml中配置的url-pattern通常为/,拦截所有非静态资源请求)。它是SpringMVC的"中央调度器",负责协调其他组件工作,避免了传统Servlet开发中多个Servlet的混乱配置。

3. DispatcherServlet调用HandlerMapping

DispatcherServlet通过HandlerMapping(处理器映射器)查找当前请求对应的处理器(Handler)。在前后端分离中,处理器通常是@Controller类中的@RequestMapping标注的方法。

常见的HandlerMapping实现:

  • RequestMappingHandlerMapping:处理@RequestMapping注解的映射关系(主流)
  • SimpleUrlHandlerMapping:通过XML配置URL与处理器的映射(传统方式)

例如,当请求/api/user/login时,HandlerMapping会找到UserController@PostMapping("/api/user/login")标注的login方法。

4. 执行HandlerInterceptor的preHandle方法

在找到处理器后,DispatcherServlet会触发拦截器链(若配置)的preHandle方法。拦截器可用于:

  • 登录校验(未登录则直接返回401)
  • 权限检查(如管理员角色验证)
  • 请求日志记录(记录请求URL、参数等)

preHandle返回false,则请求被拦截,不再继续执行;返回true则进入下一步。

5. DispatcherServlet调用HandlerAdapter

HandlerMapping返回的处理器(如Controller方法)需要通过HandlerAdapter(处理器适配器)执行。不同的处理器需要不同的适配器,SpringMVC通过适配器模式屏蔽了差异。

前后端分离中最常用的适配器是RequestMappingHandlerAdapter,它专门处理@RequestMapping标注的方法。

6. HandlerAdapter解析请求参数

HandlerAdapter会通过HttpMessageConverter将请求数据转换为Controller方法的参数。例如:

  • 将JSON格式的请求体转换为Java对象(如LoginDTO
  • 将URL路径参数(/user/{id})或请求参数(?page=1)绑定到方法参数

示例Controller方法:

@PostMapping("/api/user/login")
@ResponseBody
public Result login(@RequestBody LoginDTO loginDTO) { // loginDTO已由HttpMessageConverter从JSON转换而来return userService.login(loginDTO);
}

这里的@RequestBody注解就是告诉适配器:需要从请求体中解析参数。

7. 执行Controller方法(核心业务逻辑)

HandlerAdapter调用Controller的目标方法,执行核心业务逻辑:

  • 调用Service层处理业务(如用户登录校验、数据库操作)
  • 处理数据并返回结果(如Result对象,包含状态码、消息、数据)

在前后端分离中,Controller方法通常不涉及视图处理,仅专注于数据处理。

8. Controller返回数据对象

Controller方法执行完成后,返回一个Java对象(如Result),而非传统的ModelAndView。例如:

// 返回的Result对象
public class Result {private int code; // 状态码:200成功,400失败private String msg; // 消息private Object data; // 业务数据(如用户信息)// get/set方法
}
9. 执行HandlerInterceptor的postHandle方法

处理器执行完成后,DispatcherServlet触发拦截器链的postHandle方法。此时可以对返回的数据进行二次处理(如统一加密、补充公共字段)。

10. HttpMessageConverter转换响应数据

由于Controller方法标注了@ResponseBody(或类上标注@RestController,等价于@Controller+@ResponseBody),DispatcherServlet会调用HttpMessageConverter将Java对象(如Result)转换为JSON格式的响应体。

常用的消息转换器是MappingJackson2HttpMessageConverter(依赖Jackson库),负责Java对象→JSON的序列化。

11. 执行HandlerInterceptor的afterCompletion方法

响应数据准备完成后,触发拦截器链的afterCompletion方法。通常用于资源清理(如关闭文件流、记录请求耗时)。

12. DispatcherServlet返回HTTP响应

DispatcherServlet将转换后的JSON响应体封装为HTTP响应,返回给前端应用。前端接收后解析JSON,根据状态码和数据进行页面渲染或逻辑处理(如登录成功跳转首页)。

三、前后端分离与传统MVC流程的核心差异

对比项传统MVC(JSP视图)前后端分离(REST API)
响应内容渲染后的HTML页面JSON/XML等数据格式
核心注解@Controller+ModelAndView@RestController(含@ResponseBody
视图组件依赖ViewResolver(如JstlView)无需ViewResolver,依赖HttpMessageConverter
前后端交互方式后端主导页面跳转前端通过API主动请求数据

四、总结

SpringMVC在前后端分离架构中,通过DispatcherServlet为核心的组件协作,实现了从请求接收、参数解析、业务处理到响应数据转换的完整流程。其核心优势在于:

  1. 松耦合设计:各组件通过接口交互,便于扩展(如自定义拦截器、消息转换器)
  2. 专注数据处理:省去视图渲染环节,更适合API开发
  3. 灵活的参数/响应处理:HttpMessageConverter支持多种数据格式(JSON/XML等)

理解这一流程不仅有助于排查问题(如参数绑定失败、JSON转换异常),也能更好地利用SpringMVC的扩展点(如全局异常处理、统一响应封装)提升开发效率。

希望本文能帮助你彻底掌握SpringMVC的执行原理,在前后端分离开发中更游刃有余!

http://www.lryc.cn/news/610020.html

相关文章:

  • AI绘画-Stable Diffusion-WebUI的ControlNet用法
  • STM32F103C8T6 BC20模块NBIOT GPS北斗模块采集温湿度和经纬度发送到EMQX
  • 攻防世界-easyphp-lever1
  • k8s常见问题
  • 【ECCV2024】AdaCLIP:基于混合可学习提示适配 CLIP 的零样本异常检测
  • Design Compiler:高层次优化与数据通路优化
  • 【Spring Boot 快速入门】六、配置文件
  • Java 发送 HTTP POST请求教程
  • Scikit-learn - 机器学习库初步了解
  • MoonBit Pearls Vol.04:用MoonBit 探索协同式编程
  • Spring IoC容器与Bean管理
  • GPTs——定制的小型智能体
  • 白杨SEO:百度搜索开放平台发布AI计划是什么?MCP网站红利来了?顺带说说其它
  • [Oracle] || 连接运算符
  • 关于如何自定义vscode(wsl连接linux)终端路径文件夹文件名字颜色的步骤:
  • 【PHP】获取图片的主要颜色值RGB值
  • 【Django】-3- 处理HTTP响应
  • Django 性能优化详解:从数据库到缓存,打造高效 Web 应用
  • CNN卷积神经网络之MobileNet和ResNet(五)
  • AWS Lambda Function 全解:无服务器计算
  • CAD格式转换器HOOPS Exchange:全方位支持HOOPS系列产品
  • Webpack 搭建 Vue3 脚手架详细步骤
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现人脸面部表情的追踪识别(C#代码UI界面版)
  • [3D数据存储] Archive (File Container) | 创建/写入/读取 | 存储格式HDF5
  • pyqt5-tools/pyqt6-tools 安装失败,解决办法
  • app-1
  • Spring P1 | 创建你的第一个Spring MVC项目(IDEA图文详解版,社区版专业版都有~)
  • 理解 Agent 的基本概念与功能
  • 正点原子STM32MP257开发板移植ubuntu24.04根文件系统(带桌面版)
  • RTSP/RTMP播放器超低延迟实战:无人机远控视觉链路的工程实践