底层实现原理图:

观看底层代码:

1):打开 web.xml 文件

 2):按住 Ctrl + 鼠标左键 进入底层查看源码

  3):按住 Ctrl+o 找到对应的方法doDispatch

  5):找到下面的代码:

根据我们的请求找到需要执行的Handler(Controller)ctrl+鼠标左键 点进getHandler()  发现这个方法的返回值就是一个处理器执行链!

 6):进入getHandler之后找到下面的代码:继续进入这里的hm.getHandler(request)

--

进入之后,发现这个方法是一个接口(HandlerMapping)中的方法,没有方法实现,所以继续点击实现类AbstractHandlerMapping

7):之后发现把获取到的处理器执行链给了我们的核心控制器:回到 DispatcherServlet 类中的 doDispatch 方法中

点进去getHandlerAdapter();

 8): 再点进去supports():

  发现supports()再接口中,但是有5个实现类,springmvc默认会执行3个;

  但是我们写的HelloController间接的实现了Controller接口,所以我们只需要在SimpleControllerHandlerAdapter中打断点即可!

把拿到的HandlerAdapter返回给了核心控制器

9):核心控制器中有了处理器适配器,接下来就改执行真正的代码了:回到 DispatcherServlet 类中的 doDispatch 方法中

找到以下代码:点进去handle

同样有多个实现类:在上述说到我们现在实现的是 Controller 类型的,所以我们只关注 SimpleControllerHandlerAdapter 就可以了。

--

--

--

最终总结:

  

  1):用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。就是url-pattern的作用,并且会加载springmvc.xml配置文件。

  2):前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc.xml中配置的或者注解的url与对应的处理类找到并进行存储,

  用map<url,handler>这样的方式来存储。

  3):HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。

  4):DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。

  5):执行处理器

  6):处理器会返回一个ModelAndView对象给HandlerAdapter

  7):通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)

  8):前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象

  9):返回视图对象到前端控制器。

  10):视图渲染,就是将ModelAndView对象中的数据放到request域中,用来让页面加载数据的。

  11):通过第8步,通过名称找到了对应的页面,通过第10步,request域中有了所需要的数据,那么就能够进行视图渲染了。最后将其返回即可。

--------------------------------------------------------------------------------

以上内容若有不足之处:请多多请教

如要转载请注明小编本站地址:(https://www.cnblogs.com/mlq2017/)

分享知识-快乐自己:SpringMVC 底层执行原理解析的更多相关文章

  1. SpringMVC底层执行原理

    一个简单的HelloSpringMVC程序 先在web,xml中注册一个前端控制器(DispatcherServlet) <?xml version="1.0" encodi ...

  2. Java volatile 关键字底层实现原理解析

    本文转载自Java volatile 关键字底层实现原理解析 导语 在Java多线程并发编程中,volatile关键词扮演着重要角色,它是轻量级的synchronized,在多处理器开发中保证了共享变 ...

  3. 天天写order by,你知道Mysql底层执行原理吗?

    前言 文章首发于微信公众号[码猿技术专栏]. 在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗? 假设你要查询城市是苏州 ...

  4. 分享知识-快乐自己:反射机制Demo解析

    Java-Reflect专题 基本反射简介: 1):JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象能够调用它的任意方法和属性;这种动态获取信息以及动 ...

  5. 分享知识-快乐自己:Maven 相关原理

    依赖原则:解决模块工程之间的Jar冲突问题 1):情定设定:验证路径最短者优先原则 创建三个工程如下: Hello:并且以来 log4j.1.2.17.jar HelloFriend:依赖了工程 He ...

  6. Spring @Scheduled执行原理解析

    项目使用很多@Scheduled(cron=**) 注解来实现定时任务,既然要用就必须弄清楚的它的实现原理,于是乎翻了一下相关的源码. Spring 3.0之后增加了调度器功能,提供的@Schedul ...

  7. 持久层Mybatis3底层源码分析,原理解析

    Mybatis-持久层的框架,功能是非常强大的,对于移动互联网的高并发 和 高性能是非常有利的,相对于Hibernate全自动的ORM框架,Mybatis简单,易于学习,sql编写在xml文件中,和代 ...

  8. Spark SQL底层执行流程详解

    本文目录 一.Apache Spark 二.Spark SQL发展历程 三.Spark SQL底层执行原理 四.Catalyst 的两大优化 一.Apache Spark Apache Spark是用 ...

  9. ASP.NET MVC下的异步Action的定义和执行原理[转]

    http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html Visual Studio提供的Controller ...

随机推荐

  1. 日历插件js,jquery

    常用的日历插件 DatePicker My97DatePicker   文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing 欢迎关注,有问题一起学习欢迎留言. ...

  2. metaq入门部署到实战

    初识metaq zookeeper部署,这里单机zk为例. wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.5/zookeep ...

  3. hdu3076--ssworld VS DDD(概率dp第三弹,求概率)

    ssworld VS DDD Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  4. C# Winform 运行异常 CefSharp.core.dll 找不到指定的模块

    C# Winform开发中使用了CefSharp,之前在VS2012中运行很正常,今天换了一台Windows XP 打开VS2010 运行时,发生异常:System.IO.FileNotFoundEx ...

  5. Windows下ADB使用相关问题

    Windows下ADB使用相关问题 适用环境: 在Windows XP.WIN7下均可按本文操作进行.WIN8下没有进行实验.但操作设置大致同样.除了第4步.adb_usb.ini的位置可能有所不同以 ...

  6. LM339组成的双限比较器

    通常是上限电压值与电源电压Vcc接近,下限电压值靠近0V.

  7. VMware厚置备延迟置零,厚置备置零,精简置备具体解释

    本文具体介绍VMware厚置备延迟置零,厚置备置零,精简置备的概念及选择使用 1.厚置备延迟置零(zeroed thick) 以默认的厚格式创建虚拟磁盘.创建过程中为虚拟磁盘分配所需空间.创建时不会擦 ...

  8. /usr/bin/mysqld_safe_helper: Cannot change uid/gid (errno: 1) (转)

    From: https://www.rootusers.com/how-to-fix-mariadb-10-0-29-selinux-update-failure/ 安装mysql 10.0.29后, ...

  9. 继承ViewGroup类

    Android中,布局都是直接或间接的继承自ViewGroup类,其中,ViewGroup的直接子类目前有: AbsoluteLayout, AdapterView<T extends Adap ...

  10. urllib与urllib2的学习总结(python2.7.X): python urllib与urllib2

    https://www.cnblogs.com/wly923/archive/2013/05/07/3057122.html