Java-Spring入门指南(十三)SpringMVC核心流程
- 前言
- 一、SpringMVC是什么?
-
- (1)MVC设计模式的职责划分
- [(2)Spring MVC的核心价值](#(2)Spring MVC的核心价值)
- 二、为什么需要SpringMVC?
-
-
- [1. 传统Servlet开发的痛点](#1. 传统Servlet开发的痛点)
- [2. SpringMVC的优势](#2. SpringMVC的优势)
-
- 三、SpringMVC核心流程详解
- 四、核心组件深度解析
-
-
- [1. DispatcherServlet](#1. DispatcherServlet)
- [2. HandlerMapping](#2. HandlerMapping)
- [3. HandlerAdapter](#3. HandlerAdapter)
- [4. Controller](#4. Controller)
- [5. ViewResolver](#5. ViewResolver)
- [6. Model](#6. Model)
-
前言
- 在前几篇博客中,我们深入学习了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配置文件中指定前缀、后缀:
xml<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
|--------------------|
| 非常感谢您的阅读,喜欢的话记得三连哦 |
