概述
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,来源于 Spring 模块 spring-webmvc
,也就是我们平时所说的 “Spring MVC”。
官方文档:Web on Servlet Stack
Spring MVC 是围绕 Servlet
设计的,其核心类是 DispatcherServlet
,它是一个 Servlet
,顶层是实现的 Servlet
接口。
工作原理
DispatcherServlet
通过 Spring 配置文件来发现它需要的请求映射、视图解析、异常处理等委托组件,并由委托组件来执行。
Spring MVC 的处理流程如下:
流程说明:
- 客户端发送请求,直接请求到
DispatcherServlet
; DispatcherServlet
根据请求信息调用HandlerMapping
,查找请求对应的Handler
;- 找到对应的
Handler
后,DispatcherServlet
调用HandlerAdapter
处理适配器; HandlerAdapter
根据Handler
信息调用具体的处理器处理业务逻辑;- 业务逻辑处理完成后,会返回
ModelAndView
对象并返回给DispatcherServlet
; DispatcherServlet
调用ViewResolver
,并传ModelAndView
给它,ViewResolver
解析对应的View
并返回;DispatcherServlet
返回View
进行视图渲染请返回给客户端。
在 Handler
处理含输入参数的过程中,Spring 还根据配置做了一些预处理:
数据转换:将请求消息(JSON/XML等格式参数)转换为 Java 对象。
数据类型转换:对请求中的数据进行类型转换,如将字符型转为整形、双精度等。
数据格式化:对请求中的数据进行格式化,如将字符串转换为格式化数字或格式化日期。
数据验证:对数据有效性(空值、长度、格式等)验证,并将验证结果存储在
BindingResult
中。
如今,前端技术发展特别快,衍生出了前后端分离的开发模式,在这种模式下,使用 Spring MVC 开发的系统就不再需要处理 View
的相关内容了,Controller
只需要返回 Model
数据,不再返回 ModelAndView
。那这种模式下的流程如下图:
参考文献
[1]. https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc
[2]. Illustrated spring: http request processing flow and mechanism [4]