SpringMVC源码学习之request处理流程
目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的。
建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理解会容易得多
1.处理流程(版本为4.3.18)
入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet.doService(request,respose)处理session中的flashmap springMVC源码学习之addFlashAttribute源码分析
-->doDispatch(request, response)主要逻辑都在这里,创建modelandview,
----找到mappedHandler = getHandler(processedRequest),得到的mappedHandler包含一个请求的handler处理方法以及与该请求相关的所有拦截器,DispatcherServlet.getHandler方法会在底层调用HandlerMapping.getHandler(实际执行AbstractHandlerMapping.getHandler,调用抽象方法getHandlerInternal,此方法在子类org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapte.getHandlerInternal。中实现)
----HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());在使用@RequestMapping注解标注handler方法的时候,获取到的是HandlerAdapter的
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter实现类的一个对象;DispatcherServlet.getHandlerAdapter()调用 HandlerAdapter的实现抽象类org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.supports()调用supportsInternal()执行org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.supportsInternal(return true)
----mv = ha.handle(processedRequest, response, mappedHandler.getHandler());真正执行请求,最终通过反射调用Method.invoke,
调用HandlerAdapter是一个接口,HandlerAdapter.handle执行org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(request,respose,handler)
调用自己的handleInternal()执行org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal()
调用自己的方法invokeHandlerMethod(),RequestContextUtils.getInputFlashMap(request)可以获取到request中的attribute,且将所有的request中的attribute放置在mavContainer中,modelFactory.initModel()会将@ModelAttribute方法调用一遍,并且将相关的MV放到mavContainer,invokeAndHandle()执行conroller中的方法
调用org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(webRequest, mavContainer, new Object[0])得到returnValue和returnType并
调用父类spring-web-4.3.18.RELEASE.jar中org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(webRequest, mavContainer, providedArgs)
调用自己方法doInvoke(args)
调用父类org.springframework.web.method.HandlerMethod.getBridgedMethod().invoke(getBean(), args)
实际执行java.lang.reflect.Method.invoke(Clazz.newInstance(),inputParam)关于反射调用方法java reflect反射调用方法invoke;
SpringMVC源码学习之request处理流程的更多相关文章
- springMVC源码学习地址
springmvc工作原理以及源码分析(基于spring3.1.0) 感谢作者 宏愿, 在此记录下,以便学习 SpringMVC源码分析(1):分析DispatcherServlet.doDispa ...
- springMvc源码学习之:spirngMvc的参数注入的问题
转载:https://my.oschina.net/lichhao/blog/172562 概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成 ...
- springMVC源码学习之addFlashAttribute源码分析
本文主要从falshMap初始化,存,取,消毁来进行源码分析,springmvc版本4.3.18.关于使用及验证请参考另一篇jsp取addFlashAttribute值深入理解即springMVC发r ...
- springmvc源码学习
1.springmvc运行流程 流程图是直接在百度图片中找的一张 >.前台发送请求,请求会首先通过DispatcherServlet进行url的匹配;如果匹配不到,看是否配置<mvc: ...
- ASP.NET Core MVC 源码学习:MVC 启动流程详解
前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...
- springMVC源码学习之获取参数名
1.入口到参数处理调用流程 入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet. ...
- SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析
目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...
- springMvc源码学习之:spring源码总结
转载自:http://www.cnblogs.com/davidwang456/p/4213652.html spring beans下面有如下源文件包: org.springframework.be ...
- springMvc源码学习之:spirngMVC获取请求参数的方法2
@RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...
随机推荐
- 【java】之获取HTTP请求的值常用方法
logger.info("销帐完成通知回调,请求URL:"+req.getRequestURI().toString()); InputStream in = req.getInp ...
- Ubuntu 14.10 下Eclipse安装Hadoop插件
准备环境 1 安装好了Hadoop,之前安装了Hadoop 2.5.0,安装参考http://www.cnblogs.com/liuchangchun/p/4097286.html 2 安装Eclip ...
- Oracle随机排序函数和行数字段
随机排序函数dbms_random.value()用法:select * from tablename order by dbms_random.value() 行数字段rownum用法:select ...
- MyBatis的入门案例
1.MyBatis的结构 2.MyBatis入门案例 a.创建java项目,并在其中导入相关开发包 b.导入约束文件 http://mybatis.org/dtd/mybatis-3-config.d ...
- 云中树莓派(3):通过 AWS IoT 控制树莓派上的 Led
云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...
- opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上
1.问题:opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上 2.环境:vc6.0 win7,64位,opengl. 3.解决:将glut32.dl ...
- 廖雪峰Java3异常处理-1错误处理-1Java的异常
1.计算机运行中的错误 在计算机程序运行的过程中,错误总会出现,不可避免的 用户输入错误 读写文件错误 网络错误.内存耗尽.无法连接打印机不可 String s = "abc"; ...
- python报错'str' object is not callable
>>> x=1.235 >>> int(x) 1 >>> str="fsgavfdbafdbntsbgbt" >> ...
- windows server 2008 R2 安装
微软服务器操作系统大致有: server 2000(简称2K),还有server 2003(2K3),server 2008(2K8),server 2000和2003是基于NT内核的,而2008是基 ...
- centos 7 修改host文件
centos7与之前的版本都不一样,修改主机名在/ect/hostname 和/ect/hosts 这两个文件控制 首先修改/etc/hostname vi /etc/hostname 打开之后的内容 ...