当前位置: 首页 > 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.xdnf.cn/news/1243333.html

相关文章:

  • 句子表征-文本匹配--representation-based/interactive-based
  • MS-DOS 常用指令集
  • 机器学习——学习路线
  • 2.Java和C++有什么区别
  • Demo-LangGraph构建Agent
  • 【Spring】SpringBoot 自动配置,@ComponentScan、@Import、ImportSelector接口
  • LeetCode 132:分割回文串 II
  • Linux开发利器:探秘开源,构建高效——基础开发工具指南(下)【make/Makefile】
  • 水面垃圾清扫船cad【6张】三维图+设计说明书
  • Jmeter进行性能并发测试
  • 【Java】使用FreeMarker来实现Word自定义导出
  • C++高频知识点(十四)
  • 京东商品详情API技术文档框架及Python实现方案
  • sqli-labs:Less-27a关卡详细解析
  • 《Python 实用项目与工具制作指南》· 2.3 导入
  • Bean的生命周期和循环依赖问题的解决
  • curl发送文件bodyParser无法获取请求体的问题分析
  • 嵌入式硬件中三极管推挽电路控制与实现
  • PPT自动化 python-pptx - 11 : 备注页 (Notes Slides)
  • (论文速读)Text-IF:基于语义文本引导的退化感知交互式图像融合方法
  • sqli-labs-master/Less-31~Less-40
  • openeuler离线安装软件
  • Hexo - 免费搭建个人博客07 - 添加右上角的“目录”
  • 先知模型或者说从容的模型
  • Linux—yum仓库及NFS网络共享服务
  • Java基础-斗地主游戏
  • opencv引入libavif
  • 从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
  • Prometheus-3--Prometheus是怎么抓取Java应用,Redis中间件,服务器环境的指标的?
  • 【慕伏白】Android Studio 配置国内镜像源