Spring MVC 处理流程主要分为 前端请求、DispatcherServlet 处理、Handler 解析、执行控制器、视图解析 等多个步骤。具体流程如下:
Spring MVC 请求处理流程
1. 用户请求
用户通过浏览器或客户端发送 HTTP 请求(GET/POST/PUT/DELETE),请求 URL 形如:
bash
http://localhost:8080/user/list
其中:
http://localhost:8080
是服务器地址/user/list
是请求的路径
2. 进入 DispatcherServlet
Spring MVC 的 核心控制器 DispatcherServlet
是前端控制器(Front Controller),它是所有请求的统一入口,并负责调度后续处理流程。
DispatcherServlet 的初始化
-
继承
HttpServlet
,会在服务器启动时初始化 -
通过
web.xml
或Spring Boot 自动配置
进行注册:xml<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
-
监听所有
*.do
或/
结尾的请求
3. 查找 HandlerMapping
DispatcherServlet
根据请求 URL 解析出对应的控制器(Controller) ,它会查询 HandlerMapping
:
-
Spring Boot 默认提供的 HandlerMapping
RequestMappingHandlerMapping
(基于@RequestMapping
的映射)SimpleUrlHandlerMapping
(基于 XML 配置的映射)
-
查找逻辑
- 获取
HandlerMapping
列表 - 按优先级遍历
HandlerMapping
- 匹配 URL,找到对应的
HandlerMethod
- 获取
例如:
less
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/list")
public String getUserList() {
return "userList";
}
}
请求 /user/list
时,HandlerMapping
会匹配 UserController.getUserList()
方法。
4. 解析 HandlerAdapter
找到 HandlerMethod
后,DispatcherServlet
需要借助 HandlerAdapter
来执行该方法。
-
Spring Boot 默认提供的 HandlerAdapter
RequestMappingHandlerAdapter
(基于@RequestMapping
的适配器)SimpleControllerHandlerAdapter
(适用于Controller
接口实现类)
执行流程:
- 参数解析 :解析
@RequestParam
、@RequestBody
、@PathVariable
- 调用 Controller 方法
- 返回结果
5. 处理返回值
控制器方法返回的对象可以是:
- 视图名称 (
String
) - 数据对象 (
JSON
或ModelAndView
) - HTTP 响应 (
ResponseEntity
)
例如:
less
@RequestMapping("/list")
@ResponseBody
public List<User> getUserList() {
return userService.findAll();
}
Spring MVC 通过 HttpMessageConverter
将 List<User>
序列化为 JSON 响应。
6. 视图解析
如果返回的是 视图名称(String) ,Spring MVC 需要解析并渲染页面:
DispatcherServlet
调用ViewResolver
解析视图- 找到对应的 JSP、Thymeleaf、Freemarker 页面
- 渲染视图并返回 HTML 响应
例如:
typescript
@RequestMapping("/list")
public String getUserList(Model model) {
model.addAttribute("users", userService.findAll());
return "userList"; // 视图名称
}
- 视图解析器(ViewResolver) 会解析
"userList"
为/WEB-INF/views/userList.jsp
- 渲染页面并返回 HTML 给用户
7. 返回响应
最终,Spring MVC 将结果返回给客户端:
- 如果是 JSON,则
HttpMessageConverter
处理@ResponseBody
- 如果是 HTML,则
ViewResolver
解析 JSP/Thymeleaf 视图
Spring MVC 处理流程时序图
rust
[用户请求] --> DispatcherServlet --> HandlerMapping --> 找到 Controller
⬇ ⬇
HandlerAdapter 调用 Controller 方法
⬇ ⬇
解析返回值 (JSON/视图) --> ViewResolver (解析视图)
⬇ ⬇
渲染视图 (HTML) --> 返回 HTTP 响应
总结
Spring MVC 的完整处理流程:
- 请求进入 DispatcherServlet
- 查找 HandlerMapping 获取 Controller
- 解析 HandlerAdapter 并执行 Controller 方法
- 处理 Controller 返回值
- 视图解析(如果是 HTML)
- 渲染并返回响应
你可以尝试自己实现 DispatcherServlet
或 HandlerMapping
,加深理解!🚀