现在基于请求驱动的Web框架基本都是由单一的Servlet作为整个应用程序的前置处理器(Front Controller),该Servlet接收到具体的Web处理请求之后,会参照预先可配置的映射信息,将待处理的Web请求转发给次一级的控制器来处理。

DispatcherServlet就是Spring MVC框架中的这个单一的Servlet,它就是Spring MVC框架如此简单好用的原因,我们只需要定义一个Controller,写上自己的业务逻辑之后,即可处理Web请求了。原理就是Spring MVC已经帮我们周到的设计好了整个MVC处理的流程,该流程中的每个角色各司其职,我们需要做的仅仅只是按照模板流程填充我们的Controller代码即可。DispatcherServlet就是这个流程的指挥官,负责这与各个角色之间的交互,在解析Spring MVC源码之前,有必要先介绍框架中的各个角色及其职能。

  • DispatcherServlet:前置处理器,即指挥官,它本质就是Web容器里的Servlet,将各项工作细化并分离给了各个独立的角色来完成
  • HandlerMapping:处理器映射器,专门管理Web请求到具体的处理类之间的映射关系
  • HandlerAdaptor:处理器适配器,Spring MVC并不只是支持Controller一种Handler类型,HandlerApapter可以帮助其使用其他类型的Handler,即帮助DispatcherServlet一统调用具体Handler的方法名,这样当提供自定义的Handler时,也需提供对应的HandlerAdaptor
  • Handler:处理器,负责实现对应某个具体Web请求的处理逻辑,Controller、Interceptor、Endpoint、Action(Struts)等都是处理器
  • ModelAndView:逻辑视图名称和模型数据
  • ViewResolver:处理逻辑视图名与具体的View实例之间的映射关系
  • View:处理最终的视图渲染工作

了解了各个角色的职能后,那么这些角色间是如何交互的呢,Spring MVC处理流程如下:

其中,Handler即为我们的亲密伙伴,只需通过注解@Controller、@RequestMapping即可完成功能开发,Spring3.1之后,基于注解的Controller对应的HandlerMapping和HandlerAdapter实现类分别为:
RequestMappingHandlerMapping和RequestMappingHandlerAdapter,他们都与@RequestMapping注解相关,分别帮助指挥官找到Controller和Controller中相应的方法。

DispatcherServlet中的核心代码如下:

  • 查找处理器:
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {noHandlerFound(processedRequest, response);return;
}
  • 查找处理器适配器:
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
  • 委托处理器适配器调用Handler,返回ModelAndView:
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

处理器适配器调用Handler核心代码如下:

  • 参数绑定:
invocableMethod.setDataBinderFactory(binderFactory);
invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
  • ModelAndView初始化:
ModelAndViewContainer mavContainer = new ModelAndViewContainer();
mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
modelFactory.initModel(webRequest, mavContainer, invocableMethod);
mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
  • 通过反射调用Handler中业务代码:
invocableMethod.invokeAndHandle(webRequest, mavContainer);

Spring MVC原理解析相关推荐

  1. spring boot + spring mvc 原理解析

    前言:spring mvc 是当前最为流行的一种java WEB 框架.在还没有spring boot以前,通常搭配tomcat等容器进行web项目的开发.而现在spring全家桶越来越完善.慢慢脱离 ...

  2. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  3. Spring MVC原理及配置详解

    转载自 http://blog.csdn.net/jianyuerensheng/article/details/51258942 [Spring]Spring MVC原理及配置 1.Spring M ...

  4. 一步一步手绘Spring MVC运行时序图(Spring MVC原理)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  5. 【Spring】Spring MVC原理及配置详解

    [Spring]Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO ...

  6. Spring MVC 原理

    文章目录 一.Spring MVC 原理 1.MVC流程 2.MVC常用注解 在这里插入图片描述 总结 一.Spring MVC 原理 Spring 的模型-视图-控制器(MVC)框架是围绕一个 Di ...

  7. tomcat + spring mvc原理(六):tomcat WAR包的部署与加载

    tomcat + spring mvc原理(六):tomcat WAR包的部署与加载 前言 监控的启动原理 状态监听 部署项目 前言 单独部署的tomcat服务器在运行中,当开发人员或者运维人员将开发 ...

  8. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  9. spring MVC RequestMappingHandlerMapping解析

    spring MVC RequestMappingHandlerMapping解析 getHandler(HttpServletRequest request) 在doDispatch(HttpSer ...

最新文章

  1. java泛型之有界类型
  2. 一次 Young GC 的优化实践
  3. 如何使用Docker安装Mycat中间件 | 实现主从的读写分离,搭建属于你的Mysql 集群 | 来看看这篇吧
  4. 若依(基于SpringBoot的权限管理系统)的快速搭建
  5. 论文解读:深度监督网络(Deeply-Supervised Nets)
  6. C++中const迭代器 和 const_iterator的区别
  7. 例行性工作 排程(crontab)
  8. java中elapseTime设置新时间,Java ApplicationLike.getApplicationStartElapsedTime方法代码示例...
  9. 史上最大规模机器人“面相”调查:157张脸背后的人类感受
  10. 如何成为一名游戏设计师
  11. 局域网文件传输工具---LANDrop 使用记录
  12. 哔哩哔哩2020届秋招数据分析师面试第一轮(2019.8.8)
  13. 达梦数据库的服务启动
  14. VS2017 C++控制台程序不用加pch.h
  15. Android实时日志查看工具Logcat
  16. iOSUILable边距设置
  17. 「Spark从入门到精通系列」4.Spark SQL和DataFrames:内置数据源简介
  18. 基于51单片机的篮球赛计时计分器(仿真+源程序+原理图+PCB+论文)
  19. 用python画熊_Python数据可视化:Pandas库,只要一行代码就能实现
  20. GDKOI2018爆炸记

热门文章

  1. 2019年人工智能研发热点回眸
  2. ICC2:平行打孔create_pg_stapling_vias
  3. 服务器sata硬盘安装系统,#####SATA、RAID、SCSI硬盘用U盘安装原版XP、2003系统######支持服务器硬盘!...
  4. Java面向对象之女朋友类
  5. matlab常用的设置,坐标系、线条颜色、线型,字体、属性
  6. 字符串的下划线命名和驼峰命名转换
  7. 二分 1238:一元三次方程求解
  8. C语言预定义的标识符的作用,C语言标识符的分类
  9. 维度建模技术(1)核心概念
  10. 薛兆丰经济学讲义 | 第2章 成本