SpringMVC架构介绍
Spring Web MVC 也是一个基于请求驱动的 Web 框架,并且用了前端控制器模式:先由统一入口接住请求,再按映射规则分给对应的页面控制器(动作 / 处理器)去处理。
把请求链路和核心组件看清楚,后面配 DispatcherServlet、写 Hello World 才不会懵。
一、请求是怎么走完的
先看整体流程:
同一套映射规则,不同 URL 会落到不同的处理器,例如:
| 步骤 | 谁在干活 | 做了什么 |
|---|---|---|
| 1–2 | 前端控制器 | 用户发请求进来;按 URL 等信息选出页面控制器,把请求委托给它(以前控制器里的控制逻辑) |
| 3–5 | 页面控制器 | 收集并绑定请求参数到命令对象、做校验,再交给业务对象;处理完返回 ModelAndView(模型数据 + 逻辑视图名) |
| 6–7 | 前端控制器 + 视图 | 前端控制器收回控制权,按逻辑视图名选视图,把模型数据送进去渲染 |
| 8 | 前端控制器 | 再次收回控制权,把响应还给用户,整条链路结束 |
二、核心架构
核心架构图如下:
对应到组件上,一步步是这样走的:
| 步骤 | 从 → 到 | 要点 |
|---|---|---|
| 1 | 用户 → DispatcherServlet | 前端控制器自己不处理业务,只当统一访问点,把活委托给其他解析器,做全局流程控制 |
| 2 | DispatcherServlet → HandlerMapping | 映射成 HandlerExecutionChain:一个 Handler(页面控制器)+ 多个 HandlerInterceptor。策略模式,方便加新映射策略 |
| 3 | DispatcherServlet → HandlerAdapter | 把处理器包装成适配器,从而支持多种处理器类型(适配器模式) |
| 4 | HandlerAdapter → 处理器方法 | 按适配结果调用真正的功能方法,返回 ModelAndView(模型数据、逻辑视图名) |
| 5 | 逻辑视图名 → ViewResolver | 把逻辑视图名解析成具体 View。策略模式,方便换视图技术 |
| 6 | View → 渲染 | 按 Model 渲染;Model 本质是 Map,所以也容易接其他视图技术 |
| 7 | 回到 DispatcherServlet | 把响应返回给用户,一次请求结束 |
这里只讲核心流程,拦截器、本地化解析、文件上传解析等后边再细述。
落到开发上,核心就这几步(Hello World 里会逐项验证):
| 要配什么 | 为了什么 |
|---|---|
| web.xml 里的 DispatcherServlet | 拦截请求,进入 Spring Web MVC |
| HandlerMapping | 把请求映射到处理器 |
| HandlerAdapter | 支持多种类型的处理器 |
| ViewResolver | 把逻辑视图名解析成具体视图技术 |
| 处理器(页面控制器) | 真正做功能处理 |
三、Spring Web MVC 的优势
-
角色清楚:DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver、Controller、Validator、命令对象、表单对象,各管一段。 -
分工明确,扩展点灵活,大多数时候几乎不用自己扩。 -
命令对象就是 POJO,不必继承框架 API,可以直接当业务对象用。 -
和 Spring 其他模块无缝集成,这是不少 Web 框架做不到的。 -
可适配:HandlerAdapter 能让任意类当处理器。 -
可定制:HandlerMapping、ViewResolver 等很容易换实现。 -
数据验证、格式化、绑定机制完整。 -
用 Spring 的 Mock 对象就能比较简单地做 Web 层单元测试。 -
支持本地化、主题解析,国际化和换肤更好做。 -
JSP 标签库能把页面写得更省事。
此外还有 RESTful、简单文件上传、约定大于配置、基于注解的零配置等能力,这里不一一展开。
一句话总结:Spring MVC 的心脏是 DispatcherServlet。它自己不做事,只负责把请求交给 Mapping、Adapter、处理器和视图解析器,再把渲染结果送回浏览器。
转载请注明来源:SpringMVC架构介绍








