1、客户端请求提交的DispatcherServlet
2、由DispatcherServlet控制器查询一个或者多个HandlerMapping,找到处理请求的Controller。
3、DispatcherServlet将请求转发到Controller。
4、Controller调用业务层逻辑处理后,返回ModelAndView
5、DispatcherServlet查询一个或者多个ViewResoler视图解析器,找到ModelAndView指定的视图
6、视图负责将结果显示给客户

源码简介:首先,我们先从 DispatcherServlet 中找到获取 handler 的方法

然后进入这个方法,这个方法最终可以返回 Handler 或者 null ,返回的类型是  HandlerExecutionChain (返回的不是handler的类型,而是一个执行链)

  首先判断 handlerMappings 是否不为空,如果成立了,就进入while循环,那么handlerMappings 是什么东西呢?我们来开启DeBug来看一下

那么应该在哪里加断点呢?我们应该在核心的方法 doDispatch( ) 这里加。

然后走到获取Handler的方法,进入getHandler()方法

可以看出,handlerMappings是一个集合,集合里面还有两个对象,这两个对象是用来跟handler来进行匹配的

进入下一步,我们可以看到 mapping :BeanNameUrlHandlerMapping,在集合中我们也可以看到有一个BeanNameUrlHandlerMapping对象,然后进入 if 语句 ,handler不为空,跳出循环,返回handler

返回的handler,到getHandler方法

说了这么多,那么handlerMappings这个集合里面的两个对象到底是什么呢?我们再走下一步,进入 if 语句,我们看输出台上的mappingHandler,里面存了一个对象,内容里面有一个我们自己写的控制器,和一个拦截器

它将我们的控制器和拦截器封装成一个HandlerExecutionChain , 拦截器是spring系统自己定义的,每次执行的时候都会自带一个拦截器。

找到handler后,返回到中央控制器DispatcherServlet,中央控制器又拿着handler去请求handlerAdapter处理适配器,为什么需要适配器呢?我们带着这个疑问来看一下,跟获取handler的方法一样,找到获取适配器的方法

进入方法,这个方法藏得比较深,我们要进入多次

继续进入该方法

再进入该方法

到了,该方法返回的类型是HandlerAdapter,这个方法跟getHandler方法差不多一样,也有一个handlerAdapter集合,集合里有3个适配器,打个比方,这三个适配器就相当于笔记本的电源充电线,不同的笔记本需要使用不同的适配器,不同的handler就要使用不同的handlerAdapter,通过循环,找到匹配的适配器。为什么一上来就有这三个适配器呢?其实这三个是系统提前定义好的

在我们的jar包中可以找到,前端控制器的配置文件,我们来进入配置文件,可以看到我们之前看到的handler和handlerAdapter中,两个集合的对象。

这样我们就知道为什么我们一进去就已经有东西了,原来是在这里提前加载了。

逻辑思维:

说直白一点,首先拿到handler的目的是为了拿到控制器,比如在我们的请求路径是 localhost:8080/test ,通过获得handler,返回我们定义的控制器和一个拦截器,找到我们写的代码,那么Adapter就是找出与让控制器执行的方法。

那么为什么要搞这么麻烦呢?是为了解耦、提高程序的灵活性。

拿到适配器之后,接下来我们继续走,途中经过方法请求方式的判断

当到了这一步,我们进去看一下applyPreHandler方法

这个方法是在我们的handler执行之前,拿到拦截器的数组,逐个执行拦截器

拦截器开启完成后,开始执行handler,最终返回mv,mv是我们的ModelAndView,我们进去看看

继续进去

再进去

到了,可以看出,最终执行handler方法,返回的是ModelAndView,将handler强制转换成Controller,这样就可以执行我们定义的控制器了。

最后总结一下:

第一个就是:从2个handler中,找合适的控制器

BeanNameUrlHandlerMapping@833153a,  XML的配置方式控制器

RequestMappingHandlerMapping@3602f818   注解方式的控制器

第二个就是:从3个Adapter中,找合适的处理器

HttpRequestHandlerAdapter@28dc72d7,  SimpleControllerHandlerAdapter@6b712691,   XML的配置方式的Adapter、annotation

RequestMappingHandlerAdapter@4d763f47     注解方式的Adapter

springmvc源码解读(简介)的更多相关文章

  1. SpringMVC源码解读 - HandlerMapping

    SpringMVC在请求到handler处理器的分发这步是通过HandlerMapping模块解决的.handlerMapping 还处理拦截器. 先看看HandlerMapping的继承树吧 可以大 ...

  2. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

    使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...

  3. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系

    一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest& ...

  4. SpringMVC源码解读 - RequestMapping注解实现解读

    SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系  https://www.cnblogs.com/leftthen/p/520840 ...

  5. SpringMVC源码解读

    1.SpringMVC简介 SpringMVC框架是围绕一个DispatherServlet来设计的.这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射.视图渲染.本地化.时区与主题 ...

  6. springMVC 源码解读系列(一)初始化

    先看看DispatcherServlet的类机构: 初始化时序图: servlet初始化会调用 init 方法,换句话说就是springMVC进行初始化的时候首先会去执行HttpServletBean ...

  7. SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化

    摘要: SimpleUrlHandlerMapping只是参与Handler的注册,请求映射时由AbstractUrlHandlerMapping搞定. 初始化时,通过setMappings(Prop ...

  8. springMVC源码解读笔记

    1: DispatcherServlet 的初始化流程(调用的init方法) a) 初始化spring高级容器,WebApplicationContext(容器初始化12个步骤) Servlet类的i ...

  9. SpringMVC源码解读 - HandlerMapping - RequestMappingHandlerMapping请求分发

    AbstractHandlerMethodMapping实现接口getHandlerInternal,定义查找流程 RequestMappingInfoHandlerMapping根据RequestM ...

随机推荐

  1. java关键知识汇总

    1.泛型理解 2.java或Java框架中常用的注解及其作用详解 3.三层架构和MVC的区别 4.jdk1.8手册(提取码:bidm) 5.Rocketmq原理&最佳实践 6.spring入门 ...

  2. 网络编程之NIO

    传统的BIO(Blocking IO)的缺点: 1.基于阻塞式IO建立起来的,导致服务端一直阻塞等待着客户端发起请求,如果客户端不发起,服务端的的业务线程会一直存. 2.弹性伸缩能力差,线程数和客户端 ...

  3. MSP432 BSL流程(UART)

    升级流程 PC程序会解析脚本中的命令,根据命令码做相应的操作.数据来自于命令后的文件(当前目录下的数据文件) # cat script_P4xx_uart.txt LOG //记录日志 MODE P4 ...

  4. DX使用随记--其他

    1.  百分号显示格式 百分号:{0:P}表示显示为百分号模式.如数据源中为0.5.表示出来为50%

  5. Supervisor的使用

    版权声明:原创文章欢迎转载,不过要记得加出处哦 https://blog.csdn.net/wljk506/article/details/77146248 supervisord 是Linux/Un ...

  6. appium-清空输入框的内容后,再次输入内容会回退最后两个字符串

    问题描述 有两个输入框,用户名和密码输入框 调用set_text方法,输入用户名 再次调用set_text方法,输入密码 清空用户名输入框的内容后,再次输入内容会回退最后两个字符串 出问题的代码 de ...

  7. Linux 下升级Android Studio失败

    在Linux下进行升级的时候,会弹出一个窗口,有一个表格,从表中发现在进行某些更新某些包是没有权限,解决方法很简单,将Android Studio安装文件夹改成当前Linux登陆用户即可. 1.找到A ...

  8. Ubuntu下PHP+MySQL+Apache+PHPStorm的安装和配置

    粘贴自:https://www.jianshu.com/p/a6a0d2a29591 1.Apache的安装: $ sudo apt-get update $ sudo apt-get install ...

  9. 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)

    P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...

  10. 集合(一)-Java中Arrays.sort()自定义数组的升序和降序排序

    默认升序 package peng; import java.util.Arrays;  public class Testexample { public static void main(Stri ...