SpringMVC一点简单地源码解析
.
1.1 init(初始化)
在第一次发出请求时,会调用HttpServletBean 的init()方法 org.springframework.web.servlet.HttpServletBean.init() //读取配置文件,初始化等操作
org.springframework.web.servlet.FrameworkServlet.initServletBean() //初始化ServletBean
this.webApplicationContext = initWebApplicationContext(); //初始化上下文
org.springframework.web.servlet.DispatcherServlet.onRefresh(wac); //刷新上下文,包括初始化策略等
initStrategies(context); //初始化各个策略
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
initFrameworkServlet(); //初始化Servlet 1.2 发出请求
org.springframework.web.servlet.FrameworkServlet.doGet() //发出get请求,走此方法
processRequest() //get和post请求都走这个方法,通过org.springframework.web.context.request.RequestContextHolder中的ThreadLocal的成员变量获取上下文信息,完了把最新的上下文信息设置到ThreadLocal中
doServise() //设置一系列SpringMVC相关的请求参数:request.setAttribute
org.springframework.web.servlet.DispatcherServlet.doDispatch() //DispatcherServlet核心方法,根据请求获取对应的Controller,对请求做分发处理,控制器得到结果,通过mav处理,再继续渲染返回给前端
HandlerExecutionChain mappedHandler = getHandler(request) //根据请求获取对应的控制器(从IOC容器中通过bean名字获取),包括拦截器等等(这里处理了跨域)
org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler()
org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandlerExecutionChain() //得到系统中的拦截器,并返回处理器链
org.springframework.web.servlet.handler.AbstractHandlerMapping.getCorsHandlerExecutionChain() //先判断请求头,再得到系统中的跨域拦截器
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal() //处理请求:到了Controller中
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal() //处理请求:到了Controller中
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle() //到Controller中处理请求并得到参数
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue() //处理请求参数,如果参数的类型符合直接返回的类型,则会在这里直接响应
来点文字的东西吧
1.SpringMVC是由一个DispatcherServlet对所有的请求进行分发的;
2.SpringMVC会初始化每个Controller的信息,通过HandlerMapping接口,和请求的url,找到应该用哪个Controller的哪个方法,并且还要处理拦截器等;
3.得到HandlerMapping之后,判断选择使用哪个HandlerAdapter,这个HandlerAdapter就拥有了执行Controller方法的全部内容了,执行完成之后返回数据或者ModelAndView;
4.最后如果是数据则返回,如果是ModelAndView,则通过其解析器渲染,然后返回。
.
SpringMVC一点简单地源码解析的更多相关文章
- KBEngine简单RPG-Demo源码解析(1)
一:环境搭建1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载 下载服务端源码(KBEngine): https://github.com ...
- servlet-servlet的简单认识——源码解析
Servlet的基本认识 本内容主要来源于<看透Spring MVC源码分析与实践——韩路彪>一书 Servlet是server+Applet的缩写,表示一个服务器的应用.Servlet其 ...
- KBEngine简单RPG-Demo源码解析(2)
七:服务端资产库文件夹结构http://kbengine.org/cn/docs/concepts/directorys.html看assets, 注意:demo使用的不是默认的assets资产目录, ...
- KBEngine简单RPG-Demo源码解析(3)
十四:在世界中投放NPC/MonsterSpace的cell创建完毕之后, 引擎会调用base上的Space实体, 告知已经获得了cell(onGetCell),那么我们确认cell部分创建好了之后就 ...
- SpringMVC源码解析- HandlerAdapter - ModelFactory(转)
ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...
- springMVC源码解析--ViewResolver视图解析器执行(三)
之前两篇博客springMVC源码分析--ViewResolver视图解析器(一)和springMVC源码解析--ViewResolverComposite视图解析器集合(二)中我们已经简单介绍了一些 ...
- 设计模式-简单工厂Coding+jdk源码解析
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
- 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析
简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...
- SpringMVC源码解析- HandlerAdapter - ModelFactory
ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...
随机推荐
- 安装插件报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++
起因:学到多线程greenlet模块时,greenlet模块死活装不上,以为pycharm坏掉了,浪费了一下午. #pip3 install greenlet from greenlet import ...
- 「HAOI2011」Problem c
「HAOI2011」Problem c 传送门 由于这道题本人讲得不好,可以参考这位dalao的博客 我可就直接上代码了... 参考代码: /*---------------------------- ...
- 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in position 38: invalid continuation by
1.windows中安装虚拟环境virtualenv时, 当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in po ...
- Vue学习笔记:v-bind 属性动态绑定
v-bind 的作用 v-bind指令可以将节点的属性与动态表达式绑定在一起 v-bind可以绑定html元素中的各种属性 例如: <a v-bind:href="xxx"& ...
- urllib 库的代替品 requests 的用法
Requuests 官方的介绍时多么的霸气,之所以那么霸气,是因为 Requestts 相比于 urllib 在使用方面上会让开发者感到更加的人性化.更加简洁.更加舒适,并且国外的一些公司也在使用re ...
- nginx 的请求处理阶段
nginx处理的11个阶段 nginx处理用户请求的流程 接收用户请求头部之后 1 .匹配对应得location 2.是否进行限速 3.验证用户是否有权限访问该资源:和判断是否是盗链的请求 4.生成用 ...
- LXML解析html代码和文件
from lxml import etree text = """ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- Struts2学习(六)
拦截器原理 1.如图所示,Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一 ...
- 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法
6. 类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1. 类 6.1.1. 类的定义 package cn.itcast ...
- Linux进程管理(一)
目录 Linux进程管理(一) 参考 pstree命令 pidof命令 pmap命令 pwdx命令 ps命令 nice调优 发送信号 Linux进程管理(一)