Spring MVC原理解析
现在基于请求驱动的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原理解析相关推荐
- spring boot + spring mvc 原理解析
前言:spring mvc 是当前最为流行的一种java WEB 框架.在还没有spring boot以前,通常搭配tomcat等容器进行web项目的开发.而现在spring全家桶越来越完善.慢慢脱离 ...
- Spring MVC 原理探秘 - 一个请求的旅行过程
1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...
- Spring MVC原理及配置详解
转载自 http://blog.csdn.net/jianyuerensheng/article/details/51258942 [Spring]Spring MVC原理及配置 1.Spring M ...
- 一步一步手绘Spring MVC运行时序图(Spring MVC原理)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 【Spring】Spring MVC原理及配置详解
[Spring]Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO ...
- Spring MVC 原理
文章目录 一.Spring MVC 原理 1.MVC流程 2.MVC常用注解 在这里插入图片描述 总结 一.Spring MVC 原理 Spring 的模型-视图-控制器(MVC)框架是围绕一个 Di ...
- tomcat + spring mvc原理(六):tomcat WAR包的部署与加载
tomcat + spring mvc原理(六):tomcat WAR包的部署与加载 前言 监控的启动原理 状态监听 部署项目 前言 单独部署的tomcat服务器在运行中,当开发人员或者运维人员将开发 ...
- Spring MVC 原理探秘 - 容器的创建过程
1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...
- spring MVC RequestMappingHandlerMapping解析
spring MVC RequestMappingHandlerMapping解析 getHandler(HttpServletRequest request) 在doDispatch(HttpSer ...
最新文章
- java泛型之有界类型
- 一次 Young GC 的优化实践
- 如何使用Docker安装Mycat中间件 | 实现主从的读写分离,搭建属于你的Mysql 集群 | 来看看这篇吧
- 若依(基于SpringBoot的权限管理系统)的快速搭建
- 论文解读:深度监督网络(Deeply-Supervised Nets)
- C++中const迭代器 和 const_iterator的区别
- 例行性工作 排程(crontab)
- java中elapseTime设置新时间,Java ApplicationLike.getApplicationStartElapsedTime方法代码示例...
- 史上最大规模机器人“面相”调查:157张脸背后的人类感受
- 如何成为一名游戏设计师
- 局域网文件传输工具---LANDrop 使用记录
- 哔哩哔哩2020届秋招数据分析师面试第一轮(2019.8.8)
- 达梦数据库的服务启动
- VS2017 C++控制台程序不用加pch.h
- Android实时日志查看工具Logcat
- iOSUILable边距设置
- 「Spark从入门到精通系列」4.Spark SQL和DataFrames:内置数据源简介
- 基于51单片机的篮球赛计时计分器(仿真+源程序+原理图+PCB+论文)
- 用python画熊_Python数据可视化:Pandas库,只要一行代码就能实现
- GDKOI2018爆炸记
热门文章
- 2019年人工智能研发热点回眸
- ICC2:平行打孔create_pg_stapling_vias
- 服务器sata硬盘安装系统,#####SATA、RAID、SCSI硬盘用U盘安装原版XP、2003系统######支持服务器硬盘!...
- Java面向对象之女朋友类
- matlab常用的设置,坐标系、线条颜色、线型,字体、属性
- 字符串的下划线命名和驼峰命名转换
- 二分 1238:一元三次方程求解
- C语言预定义的标识符的作用,C语言标识符的分类
- 维度建模技术(1)核心概念
- 薛兆丰经济学讲义 | 第2章 成本