Java-Spring入门指南(十三)SpringMVC核心流程
前言
- 在前几篇博客中,我们深入学习了Spring的IOC(控制反转)与AOP(面向切面编程),掌握了如何经过Spring管理对象、解耦业务逻辑与通用增强逻辑。
- 而在实际Web应用开发中,如何高效处理HTTP请求、组织页面与业务的交互是核心问题。
- Spring MVC作为Spring家族专为Web层设计的框架,完美承接了Spring的核心优势,让Web开发变得更简洁、模块化。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482


什么?就是一、SpringMVC
Spring MVC 是Spring Framework 中的一个Web层框架,基于经典的MVC设计模式(Model-View-Controller,模型-视图-控制器)实现,用于简化Java Web应用的请求处理与页面渲染流程。
(1)MVC设计模式的职责划分
- Model(模型):封装业务数据与核心业务逻辑(通常由Service、Repository等组成,与Spring核心容器的Bean一致)。
- View(视图):负责页面渲染(如JSP、Thymeleaf、HTML等,展示Model中的数据)。
- Controller(控制器):作为请求的“入口”,接收HTTP请求,调用Model处理业务,最终选择View返回响应。
(2)Spring MVC的核心价值
它并非重新发明MVC,而是以Spring的IOC容器为基础,为MVC各组件给予了更灵活的安装与更简洁的开发方式,让Web层与业务层(Service、DAO等)能无缝集成,同时通过“前端控制器+组件化分工”的设计,大幅简化了传统Servlet开发的复杂度。
二、为什么必须SpringMVC?
在Spring MVC出现前,Java Web开发主要依赖原生Servlet/JSP或Struts2等框架,存在诸多障碍:
1. 传统Servlet开发的痛点
- 配置繁琐:每个请求都需编写独立Servlet,配置
web.xml的<servlet>与<servlet-mapping>,当请求数量大时,配置爆炸式增长。 - 代码耦合严重:Servlet中既要处理请求参数、又要调用业务逻辑、还要手动转发/重定向页面,职责不单一。
- 视图与逻辑混杂:若用JSP+Scriptlet,Java代码与HTML页面高度混杂,维护性极差。
2. SpringMVC的优势
- 集中式请求调度:通过
DispatcherServlet(前端控制器)统一接收所有请求,再分发给不同Controller,无需为每个请求单独配置。 - 组件化分工清晰:
HandlerMapping(找Controller)、HandlerAdapter(执行Controller)、ViewResolver(解析视图)等组件各司其职,符合“高内聚、低耦合”。 - 与Spring无缝集成:Spring MVC的Controller、Service等都可作为Spring Bean管理,直接享受IOC、AOP等特性。
- 灵活的视图支持:不仅协助JSP,还能轻松集成Thymeleaf、Freemarker等模板引擎,甚至纯JSON接口(前后端分离场景)。
三、SpringMVC核心流程详解
通过一张图,我们能直观看到Spring MVC从“接收请求”到“返回响应”的全链路流程:

流程分步拆解
步骤1:HTTP请求到达前端控制器
客户端(浏览器、APP等)发送HTTP请求,所有请求首先被DispatcherServlet拦截(需在web.xml中配置其为“前端控制器”)。步骤2-3:查找处理器(Handler)
DispatcherServlet向HandlerMapping(处理器映射器)询问:“当前请求应该由哪个处理器(Controller方法)处理?”HandlerMapping根据请求的URL、请求方式(GET/POST等),匹配到对应的HandlerExecutionChain(处理器执行链,包含目标Controller方法及拦截器等)并返回。步骤4-7:执行处理器(Controller)
DispatcherServlet拿到HandlerExecutionChain后,通过HandlerAdapter(处理器适配器)调用具体的Controller方法。Controller内部调用Service处理业务逻辑,Service再调用Repository操作数据库(如MySQL),同时可能与Model(封装数据的对象)交互。Controller处理完业务后,将结果(如Model数据、视图名称)返回给HandlerAdapter,再由HandlerAdapter回传给DispatcherServlet。
步骤8-12:解析与渲染视图
DispatcherServlet向ViewResolver(视图解析器)询问:“如何解析返回的视图名称?”ViewResolver根据配置(如前缀、后缀)找到对应的View(如JSP文件、Thymeleaf模板),DispatcherServlet再渲染View(填充Model数据),最终将完整的页面(或JSON数据)响应给客户端。
四、核心组件深度解析
Spring MVC的高效运行,依赖以下核心组件的协作:
1. DispatcherServlet
- 作用:是整个Spring MVC的“大脑”,统一接收所有HTTP请求,协调其他组件结束请求处理。
- 类比:如同餐厅的“前台”,所有顾客(请求)先找前台,再由前台安排服务员(Controller)、厨师(Service)、传菜员(ViewResolver)等分工。
- 配置方式:需在
web.xml中配置(或Spring Boot自动配置),指定其拦截的请求路径(如/*或*.do)。
2. HandlerMapping
- 作用:根据请求的URL、请求方法等信息,找到“哪个Controller的哪个办法”应该处理该请求。
- 具体工作:内部维护“请求路径 → Controller方法”的映射关系(可通过注解
@RequestMapping、配置文件等方式定义)。 - 类比:如同“菜单-厨师”的映射表,前台(DispatcherServlet)问“顾客点了宫保鸡丁,该找哪个厨师?”,
HandlerMapping就返回对应的厨师(Controller方法)。
3. HandlerAdapter
- 作用:因为Controller的实现形式可能不同(如注解式Controller、实现特定接口的Controller),
HandlerAdapter负责“适配”不同形式的Controller,调用其方法。 - 类比:不同厨师(Controller)有不同的做菜习惯(实现方式),传菜员(HandlerAdapter)负责按照统一方式从厨师那里取菜(调用方法),再交给前台。
4. Controller
- 作用:是业务逻辑的“入口”,接收请求参数,调用Service处理业务,最终返回“逻辑视图名+Model材料”。
- 实现方式:最常用的是注解式Controller(如
@Controller+@RequestMapping),也可实现Spring的Controller接口。
5. ViewResolver
- 作用:将Controller返回的“逻辑视图名”(如
"hello")解析为“物理视图地址”(如/WEB-INF/views/hello.jsp)。 - 配置示例:在Spring配置文件中指定前缀、后缀:
此时,逻辑视图名<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>"hello"会被解析为/WEB-INF/views/hello.jsp。
6. Model
- 作用:封装Controller处理后的数据,供View渲染时使用。
- 形式:可以是普通Java对象、
Map、Model接口等,Spring会自动将其数据传递到View中。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482
| 非常感谢您的阅读,喜欢的话记得三连哦 |

浙公网安备 33010602011771号