springmvc运行流程简单解释(源码解析,文末附自己画的流程图)
首先看一下DispatcherServlet结构:

观察HandlerExecutionChain对象的创建与赋值,这个方法用来表示执行这个方法的整条链。

进入getHandler方法:

此时的变量handlerMappings为:

刚好对应我们的三个方法,说明了我们的方法映射全部存放在handlerMappings中,通过遍历handlerMapping来进行操作。
通过HandlerMapping来对HandlerExecutionChain赋值。

执行完这一句参数有,说明获取了一条完整的链,可以来进行执行了,注意此时获取到的是所有拦截器,因为必须要走过所有拦截器。


通过HandlerExecutionChain对象来获取HandlerAdapter对象,通过这个对象进行控制器方法的调用,并返回ModelAndView对象,再通过ModelAndView对象调用解析器创建视图对象,再通过视图对象的渲染方法来进行最终的用户的需求结果处理。

完成这一步后使用ha调用拦截器的preHandle方法,如果放行,则执行handle方法,不放行,则返回:

进入此方法中:

下一步就是执行handler处理方法,执行完方法返回一个ModelAndView对象,使用此对象调用视图解析器创建视图对象,再根据视图对象调用其渲染方法将模型中的数据以特定的格式传输给用户。

继续执行:

执行到这里以及执行完核心业务了,需要执行postHandler方法,注意这个注释,无论是不是有异常,最终都是到这个方法中,并且有相应的异常的话还是会返回一个ModalAndView对象,让错误的结果还是能正常返回,并给出相对友好的提示信息。
/**
- Handle the result of handler selection and handler invocation, which is
- either a ModelAndView or an Exception to be resolved to a ModelAndView.
*/
处理完postHandler方法之后,再执行processDispatcherResult方法。

有异常的处理:

执行渲染方法:

进入方法,根据视图解析器获取视图,获得视图对象就返回:

解析完成,调用view的 render方法(注意不是DispatcherServlet的render方法):

view的render方法:


执行完渲染,跳转时执行拦截器的afterCompletion方法。

进入方法:

弄完这些,还要通过过滤器链等等,最终才完成一整个springmvc的执行流程。
按照我自己的理解,画出了这么一幅流程图,希望对大家有帮助:

springmvc运行流程简单解释(源码解析,文末附自己画的流程图)的更多相关文章
- 面试高频SpringMVC执行流程最优解(源码分析)
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! SpringMVC执行流程 SpringMVC概述 Spri ...
- KBEngine简单RPG-Demo源码解析(1)
一:环境搭建1. 确保已经下载过KBEngine服务端引擎,如果没有下载请先下载 下载服务端源码(KBEngine): https://github.com ...
- servlet-servlet的简单认识——源码解析
Servlet的基本认识 本内容主要来源于<看透Spring MVC源码分析与实践——韩路彪>一书 Servlet是server+Applet的缩写,表示一个服务器的应用.Servlet其 ...
- SpringMVC一点简单地源码解析
. 1.1 init(初始化) 在第一次发出请求时,会调用HttpServletBean 的init()方法 org.springframework.web.servlet.HttpServletBe ...
- 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框架核心方法调用源码解析
- Flink 源码解析 —— 源码编译运行
更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动
Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...
随机推荐
- 5. SOFAJRaft源码分析— RheaKV中如何存放数据?
概述 上一篇讲了RheaKV是如何进行初始化的,因为RheaKV主要是用来做KV存储的,RheaKV读写的是相当的复杂,一起写会篇幅太长,所以这一篇主要来讲一下RheaKV中如何存放数据. 我们这里使 ...
- windows下安装nginx和基本配置
1.下载并安装nginx 到nginx官网上下载相应的安装包,http://nginx.org/en/download.html: 下载之后进行解压,将解压后的文件放到自己心仪的目录下,如下图所示: ...
- 大数据之路week01--自学之集合_2(列表迭代器 ListIterator)
列表迭代器: ListIterator listerator():List集合特有的迭代器 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法 特有功能: ...
- Project Euler 51: Prime digit replacements
通过替换*3这样一个两位数的第一位,我们可以发现形成的九个数字有六个是质数,即13, 23,43,53,73,83.类似的,如果我们用同样的数字替换56**3这样一个五位数的第三位和第四位,会生成56 ...
- Machine Learning in Action ---- kNN
------------恢复内容开始------------ # -*- coding: utf-8 -*- """ Created on Thu Nov 14 19:2 ...
- [ISE使用] 使用ISE的过程中,遇到过的一些“软件上的问题”
1.planahead打不开了. PlanAhead替代文件rdiArgs.bat的下载链接如下: http://www.eevblog.com/forum/microcontrollers/guid ...
- [ERROR]Unable to locate package
刚更换了DNS,需要更新下apt-get $ apt-get update
- 使用 layUI做一些简单的表单验证
使用 layUI做一些简单的表单验证 <form method="post" class="layui-form" > <input name ...
- 100天搞定机器学习|Day56 随机森林工作原理及调参实战(信用卡欺诈预测)
本文是对100天搞定机器学习|Day33-34 随机森林的补充 前文对随机森林的概念.工作原理.使用方法做了简单介绍,并提供了分类和回归的实例. 本期我们重点讲一下: 1.集成学习.Bagging和随 ...
- mysql初级了解
mysql是一个关系型数据库系统,可以存放若干个数据库,每个数据库中 可以存放若干张表,每张表中可以存放若干条记录 基本代码: 1.查看数据库 show databases: 2.创建数据库 ...