springMVC请求调用过程
在传统的MVC模式中,Tomcat通过读取web.XML配置文件来获取servlet和访问路径的映射关系,这样在访问tomcat就能将请求转发给对应的servlet进行处理。
自定义的servlet是需要继承HttpServlet这个类,众所周知,一个servlet的生命周期是要经历的init()、service()、destory()这几个过程,最初通过继承GenericServlet类重写上面三个方法来实现自定义的servlet,之后通常是通过继承HttpServlet这个类是实现doGet()和doPost()来实现自定义的servlet。其实HttpServlet也是继承了GenericServlet重写了生命周期方法将servletResquest和servletResponse强转成HttpServletRequset和HttpServletResponse,然后使用模板方法的设计模式,判断请求方式进行调用重写的方法。


接下来转回正题,查看SpringMVC的调用过程,在SpringMVC中只使用了DispatcherServlet来拦截了所有的请求,在上次将filter的调用过程中,最后执行的servlet就是dispatcherServlet,在创建ApplicationFilterChain的时候就将其给赋值进去了。

DispatcherServlet也是继承了HttpServlet类,可以去debug查看DispatcherServlet和HttpServlet之间的继承关系,在接下来的几步父类和子类之间重写方法的互相调用,重点是如何由通过映射调用到Servlet到通过路径找到对应控制器的方法。主要的执行语句是:org/springframework/web/servlet/handler/AbstractHandlerMapping.class:225

可以看到根据request找到相对应控制器的方法的元数据信息,即org.springframework.web.method.HandlerMethod
深入方法中可以看到org.springframework.web.servlet.handler.AbstractHandlerMethodMapping中存储控制器中路径和方法元数据的的数据结构

其实到这里我们可以猜出是通过反射调用的方式来请求控制器方法的了,具体的调用语句是:
org/springframework/web/method/support/InvocableHandlerMethod.class:102
剩下的就是获取HandleMethod中的Method和bean、request中的args,进行反射调用了。
在这其中的数据组装就不涉及了。
springMVC请求调用过程的更多相关文章
- SpringMVC 请求调用过程
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherServlet查询一个或多个Han ...
- SpringMVC处理客户端请求的过程
SpringMVC处理客户端请求的过程 以程序部署在Tomcat上为例,网站程序使用SpringMVC框架开发. 1.客户端发起一个访问网站的请求(如: localhost:8080/index). ...
- springMVC源码分析--HandlerInterceptor拦截器调用过程(二)
在上一篇博客springMVC源码分析--HandlerInterceptor拦截器(一)中我们介绍了HandlerInterceptor拦截器相关的内容,了解到了HandlerInterceptor ...
- Spring框架系列(14) - SpringMVC实现原理之DispatcherServlet处理请求的过程
前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet ...
- rxjava 调用retrofit执行网络请求的过程
retrofit流程图 -1.RxJava调用Retrofit,从requestGtPushSaeUserInfo()中获得被观察者observable,然后new一个观察者向它订阅 0.从业务中 ...
- 源码深度解析SpringMvc请求运行机制(转)
源码深度解析SpringMvc请求运行机制 本文依赖的是springmvc4.0.5.RELEASE,通过源码深度解析了解springMvc的请求运行机制.通过源码我们可以知道从客户端发送一个URL请 ...
- SpringMVC handleMapping映射过程
初始化IOC容器 Spring初始化的时候会优先初始化自定义的类,下面这个就是 org.springframework.web.servlet.mvc.method.annotation.Reques ...
- SpringMVC 请求全过程漫谈
SpringMVC 请求全过程漫谈 SpringMVC 跟其他的mvc框架一样,如 struts,webwork, 本质上都是 将一个 http 请求(request)进行各种处理, 然后返回resp ...
- SpringMVC异步调用,Callable和DeferredResult的使用
Callable和DeferredResult都是springMVC里面的异步调用,Callable主要用来处理一些简单的逻辑,DeferredResult主要用于处理一些复杂逻辑 1.Callabl ...
随机推荐
- Java中的对象都是在堆上分配的吗?
作者:LittleMagic https://www.jianshu.com/p/8377e09971b8 为了防止歧义,可以换个说法: Java对象实例和数组元素都是在堆上分配内存的吗? 答:不一定 ...
- GIT之分支管理
分支管理 一.分支推进 主分支 单线分支,随着代码的提交而形成的一条直线,HEAD 随着commit提交之后的节点移动而移动. 子分支 当切换到子分支的时候,HEAD 则指向子分支的节点. 在子分支上 ...
- 基于python实现链式队列代码
""" 链式存储-队列 linkqueue.py 代码实现 思路: 1.入队, 2.出队, 3.判断空满 """ # 异常类 class Q ...
- 【UR #13】Yist
UOJ小清新题表 题目摘要 UOJ链接 给出一个排列 \(A\) 以及它的一个非空子序列 \(B\),给出一个 \(x\) 并进行若干次操作,每一次操作需要在 \(A\) 中选择一个长度恰好为 \(x ...
- VIM 批量注释的两种方法 (转)
方法一 ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I(shift+i),再插入注释符,比如"//",再按Esc,就会全部注释了 批 ...
- 自定义view的drawRoundRect模拟进度条
主要方法发介绍 1:drawRoundRect参数介绍 drawRoundRect(l,t,r,b,rx,ry,paint)里面的参数可以有两种: 1:前四个参数(l,t,r,,b)分别是矩形左边距离 ...
- java的回收机制
在java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个: 1.给对象赋值为null,以下没有调用过. 2.给对象赋了新的值,重新分配了内存空间.
- C#8.0之后接口已经不再单纯了,我懵逼了!
一:背景 1. 讲故事 大家在经过面向对象洗礼的时候,都了解过接口,而且知道它是一种自上而下的设计思路,举个例子,我们电脑上都有 USB 2.0 接口,蓝牙耳机实现了它可以进行充电,移动硬盘实现了它可 ...
- Ubuntu使用mail命令发送邮件
sudo apt-get install mailutils 如下命令发送邮件: mail -s "Test mail from ubuntu" ckboss@y< ...
- Paraview教程
快速入门 https://www.youtube.com/watch?time_continue=1017&v=Y1RATo2swM8 Cyprien Rusu系列 Paraview Vide ...