SpringMVC底层执行流程是在面试过程中经常被问到一个问题,下面潘老师对SpringMVC的工作原理做一下总结:
SpringMVC的工作流程图:
1、相关名词说明
1、前端控制器(DispatcherServlet)
- 接收请求,响应结果,相当于转发器,中央处理器
2、处理器映射器(HandlerMapping)
- 根据请求的url查找Handler(处理器/Controller)
- 可以通过XML和注解方式实现映射。
3、处理器适配器(HandlerAdapter)
- 按照HandlerAdapter所要求的规则执行Handler
4、处理器Handler(也称之为Controller)
- 接收用户请求信息,调用业务方法处理请求,也称之为后端控制器
5、视图解析器(ViewResolver)
- 进行视图解析,把逻辑视图解析成真正的物理视图
6、视图(View)
- 把数据展现给用户的页面
2、SpringMVC的工作流程说明:
第1步: 请求发送拦截
用户(客户端/浏览器)向服务器发送请求,请求被SpringMVC的前端控制器
DispatcherServlet
捕获第2步:调用HandlerMapping,返回执行链
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping(处理器映射器)获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象(执行链)的形式返回
第3步:调用HandlerAdapter
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter(处理器适配器)调用
附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法
第4步:调用Controller
HandlerAdapter经过适配调用具体的Handler处理器(就是我们写的Controller),并将提取Request中的模型数据,填充Handler入参
补充:在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
第5步:返回ModelAndView
Controller执行完成会返回一个ModelAndView对象,HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
第6步:获取ViewResolver
根据返回的ModelAndView,选择一个适合的ViewResolver(视图解析器)返回给DispatcherServlet,然后DispatcherServlet将ModelAndView传给该ViewReslover
注意:该ViewResolver必须是已经注册到Spring容器中的 ViewResolver
第7步:渲染视图
ViewResolver解析后返回具体View(物理视图),DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
第8步:返回客户端
将渲染结果返回给用户客户端
3、精简版:
- 1. 用户发送请求到前端控制器DispatcherServlet
- 2. DispatcherServlet收到请求调用处理器映射器HandlerMapping
- 3. HandlerMapping通过注解或XML找到具体的处理器,并生成执行链返回给DispatcherServlet。
- 4. DispatcherServlet调用处理器适配器HandlerAdapter
- 5. HandlerAdapter经过适配调用具体的处理器(Controller)
- 6. Controller执行完成返回ModelAndView对象
- 7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
- 8. DispatcherServlet将ModelAndView传给视图解析器ViewReslover
- 9. ViewReslover解析后返回具体的视图View
- 10. DispatcherServlet根据View进行渲染视图
- 11. DispatcherServlet将页面响应给用户
4、涉及组件分析:
1、前端控制器DispatcherServlet(不需要程序员开发),由框架提供,在web.xml中配置。
作用:接收请求,响应结果,相当于转发器,中央处理器。
2、处理器映射器HandlerMapping(不需要程序员开发),由框架提供。
作用:根据请求的url查找Handler(处理器/Controller),可以通过XML和注解方式来映射。
3、处理器适配器HandlerAdapter(不需要程序员开发),由框架提供。
作用:按照特定规则(HandlerAdapter要求的规则)去执行Controller。
4、控制器Controller(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
5、视图解析器ViewResolver(不需要程序员开发),由框架提供
作用:进行视图解析,把逻辑视图名解析成真正的物理视图。
SpringMVC框架支持多种View视图技术,包括:jstlView、freemarkerView、pdfView等。
6、视图View(需要工程师开发)
作用:把数据展现给用户的页面
View是一个接口,实现类支持不同的View技术(jsp、freemarker、pdf等)