Spring MVC 核心工作流程
1. 流程起点:用户发起请求
- 角色:用户(浏览器/客户端)
- 动作:发送 HTTP 请求(如访问
http://xxx/user/list
),请求先到达 DispatcherServlet(Spring MVC 入口)。
2. 核心调度:DispatcherServlet(前端控制器)
作为 Spring MVC 的“总调度”,是所有请求的入口,负责协调后续所有组件:
- 职责:接收请求 → 调用其他组件处理 → 组装响应返回。
3. 找处理器:HandlerMapping(处理器映射器)
- 作用:根据请求的 URL,查找对应的 Handler(处理器,通常是 Controller 的方法)。
- 细节:还会关联 HandlerInterceptor(处理器拦截器),形成
HandlerExecutionChain
(包含拦截器 + 处理器),用于在请求前后做增强(如日志、权限校验 )。
4. 执行处理器:Handler + HandlerAdapter(处理器适配器)
- Handler:即实际处理请求的业务逻辑(如
UserController
的某个方法 ),可理解为“谁处理这个请求”。 - HandlerAdapter:“适配器”,因为 Handler 有多种实现方式(如注解式、实现接口等 ),Adapter 负责适配调用,让框架能统一执行不同类型的 Handler。
- 执行结果:返回
ModelAndView
(包含数据Model
+ 视图名View
),也可能直接返回数据(如 REST 接口用@ResponseBody
)。
5. 解析视图:ViewResolver(视图解析器)
- 作用:根据
ModelAndView
中的视图名,解析出实际的 View(视图对象,如 JSP、Thymeleaf 模板 )。 - 细节:拼接视图路径(如配置前缀
/WEB-INF/views/
+ 视图名userList
+ 后缀.jsp
),找到最终要渲染的视图文件。
6. 渲染视图:View(视图)
- 职责:结合
Model
中的数据(如用户列表、提示消息 ),渲染出完整的页面(HTML)。 - 输出:生成的响应内容(HTML/JSON 等)通过
DispatcherServlet
返回给用户。
7. 流程闭环:返回响应
- 结果:用户收到最终响应(如网页、接口数据 ),流程结束。
关键设计思想
- 职责分离:每个组件只做一件事(DispatcherServlet 调度、Handler 处理业务、View 渲染…),符合“单一职责”。
- 可扩展:通过适配器(HandlerAdapter)、拦截器(HandlerInterceptor)等,轻松扩展功能(如添加日志、校验 )。
- 解耦:组件间通过接口交互(如 HandlerMapping 不直接依赖 Controller 实现 ),降低代码耦合度。
简单总结流程:
用户请求 → DispatcherServlet 接收 → HandlerMapping 找处理器 → HandlerAdapter 执行 Handler → 返回 ModelAndView → ViewResolver 解析视图 → View 渲染 → 响应给用户