SpringMVC运行流程分析
一、运行流程图
下面是 SpringMVC 运行流程的分析图,包括了拦截器的调用过程,目标资源的处理以及异常处理。
二、运行流程中的相关组件
在上面的流程图中有几个比较重要的组件,下面大概描述一下其对应的作用。
DispatcherServlet
:用于接收请求,响应结果。相当于转发器,中央处理器。用户请求到达DispatcherServlet
,它是整个流程控制中心,由它调用其它组件来处理用户的请求,DispatcherServlet
的存在降低了组件之间的耦合性。
HandlerMapping
:负责根据用户请求的URL
找到handler
路由处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
HandlerAdapter
:按照特定的规则帮助DispatcherServlet
去执行handler
。比如调用带注释的控制器需要解析注释等。
ViewResolver
:提供视图名称和实际视图之间的映射。ViewResolver
首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View
视图对象,最后对View
进行渲染将处理结果通过页面展示给用户。
三、源码分析
运行流程的执行通过DispatcherServlet
中的doDispatch(HttpServletRequest request, HttpServletResponse response)
方法进行统一的调用与管理。
PS:这里只能给大家提供一个调试代码的方法,其中有很多细节这里就不再一一描述了。
下面贴出 SpringMVC 4.3.16.RELEASE
版本中 doDispatch()
方法的源代码。
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest = request;HandlerExecutionChain mappedHandler = null;boolean multipartRequestParsed = false;WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);try {ModelAndView mv = null;Exception dispatchException = null;try {processedRequest = checkMultipart(request);multipartRequestParsed = (processedRequest != request);// 在getHandler方法中通过HandlerMapping获得HandlerExecutionChain对象mappedHandler = getHandler(processedRequest);if (mappedHandler == null || mappedHandler.getHandler() == null) {noHandlerFound(processedRequest, response);return;}// 获得HandlerAdapter对象HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());String method = request.getMethod();boolean isGet = "GET".equals(method);if (isGet || "HEAD".equals(method)) {long lastModified = ha.getLastModified(request, mappedHandler.getHandler());if (logger.isDebugEnabled()) {logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);}if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {return;}}// 调用拦截器的preHandle()方法if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}// 调用目标路由方法得到ModelAndView对象mv = ha.handle(processedRequest, response, mappedHandler.getHandler());if (asyncManager.isConcurrentHandlingStarted()) {return;}applyDefaultViewName(processedRequest, mv);// 调用拦截器的postHandle()方法 mappedHandler.applyPostHandle(processedRequest, response, mv);}catch (Exception ex) {dispatchException = ex;}catch (Throwable err) {dispatchException = new NestedServletException("Handler dispatch failed", err);}/*** 在processDispatchResult() 方法中首先会判断是否存在异常,然后完成试图的渲染,* 并调用拦截器的afterCompletion()方法*/processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}catch (Exception ex) {triggerAfterCompletion(processedRequest, response, mappedHandler, ex);}catch (Throwable err) {triggerAfterCompletion(processedRequest, response, mappedHandler,new NestedServletException("Handler processing failed", err));}finally {if (asyncManager.isConcurrentHandlingStarted()) {if (mappedHandler != null) {mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);}}else {if (multipartRequestParsed) {cleanupMultipart(processedRequest);}}}}
doDispatch(HttpServletRequest request, HttpServletResponse response)
方法调用了很多其他的方法来保证运行流程正确的执行,对于这些方法具体做了什么,需要你自己通过 DEBUG 的方式去了解。
SpringMVC运行流程分析相关推荐
- SparkSteaming运行流程分析以及CheckPoint操作
本文主要通过源码来了解SparkStreaming程序从任务生成到任务完成整个执行流程以及中间伴随的checkpoint操作 注:下面源码只贴出跟分析内容有关的代码,其他省略 1 分析流程 应用程序入 ...
- WordPress 运行流程分析
2019独角兽企业重金招聘Python工程师标准>>> WordPress 的运行流程如下图所示: 整个wp的程序结构比较特别,也不象一些普通的面向过程,也不是MVC,总之就是他自己 ...
- vue3 源码分析-运行流程分析
虚拟dom和代理可以参考其他博客,此博客介绍vue3运行流程.方便理解vue的运行流程. 一.初次渲染流程 const createApp = ((...args) => {const app ...
- SpringMVC执行流程分析
1. 用户通过url发起请求,请求送到前置控制器(DispatcherServlet).2. 前置控制器是整个SpringMVC的控制中心,当接收到用户的请求之后, 根据请求传来的 url 去 处理器 ...
- ecos运行流程分析
先实践后理论,我使用一块CPE301G-QCA9535的开发板进行分析.这块开发板是在开发中的ecos. 一)宏观分析ecos的运行 我们从启动日志入手,去一步一步了解ecos的运行. 总所周知,板子 ...
- Spring MVC学习总结(16)——SpringMVC运行流程深度解析(含代码)
spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器 ...
- SpringMV工作流程分析
SpringMVC 运行流程 : 运行流程图解 (1)用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获: (2)DispatcherServlet对请 ...
- HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程
在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...
- Apache Shiro的运行流程和权限控制方式分析
Apache Shiro的运行流程和权限控制方式分析 Shiro的架构有3个主要的概念: Subject SecurityManager Realms 下面的关系图是关于这些组件是如何交互的高级概述. ...
最新文章
- Could not fetch URL https://pypi.org/simple/pip/
- JavaScript 设计模式基础(二)
- 【知识星球】softmax损失相关的小问题
- hdu 5624 KK's Reconstruction(最小生成树)
- 备战“双11”,阿里云为企业提供一站式资源保障服务
- JPDL3.1规范手册
- java 二叉树特点_疯狂java笔记之树和二叉树
- 数组的升序排序 字符串的方法 0308
- HDSF主要节点解说(二)工作原理
- iis同时运行django和php,使用Django同时运行UWSGI和ASGI
- [VB]使用ADOX创建Excel文件
- 让Cocos2dx中的TestCPP中的Box2dTest运行起来
- 拉普拉斯(逆)变换的计算
- OEIS A098928 数表扩充
- 日期转农历日期的一个插件
- 关于微信的几点更新与操作
- SpringBoot 雪花算法生成商品订单号【SpringBoot系列13】
- php自学建议_php自学提升进阶路线
- rospy基础--001_talker_listener
- 分享点22年计算机考研经验(反面)