一、运行流程图

下面是 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运行流程分析相关推荐

  1. SparkSteaming运行流程分析以及CheckPoint操作

    本文主要通过源码来了解SparkStreaming程序从任务生成到任务完成整个执行流程以及中间伴随的checkpoint操作 注:下面源码只贴出跟分析内容有关的代码,其他省略 1 分析流程 应用程序入 ...

  2. WordPress 运行流程分析

    2019独角兽企业重金招聘Python工程师标准>>> WordPress 的运行流程如下图所示: 整个wp的程序结构比较特别,也不象一些普通的面向过程,也不是MVC,总之就是他自己 ...

  3. vue3 源码分析-运行流程分析

    虚拟dom和代理可以参考其他博客,此博客介绍vue3运行流程.方便理解vue的运行流程. 一.初次渲染流程 const createApp = ((...args) => {const app ...

  4. SpringMVC执行流程分析

    1. 用户通过url发起请求,请求送到前置控制器(DispatcherServlet).2. 前置控制器是整个SpringMVC的控制中心,当接收到用户的请求之后, 根据请求传来的 url 去 处理器 ...

  5. ecos运行流程分析

    先实践后理论,我使用一块CPE301G-QCA9535的开发板进行分析.这块开发板是在开发中的ecos. 一)宏观分析ecos的运行 我们从启动日志入手,去一步一步了解ecos的运行. 总所周知,板子 ...

  6. Spring MVC学习总结(16)——SpringMVC运行流程深度解析(含代码)

    spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器 ...

  7. SpringMV工作流程分析

    SpringMVC 运行流程 : 运行流程图解 (1)用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获: (2)DispatcherServlet对请 ...

  8. HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程

    在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...

  9. Apache Shiro的运行流程和权限控制方式分析

    Apache Shiro的运行流程和权限控制方式分析 Shiro的架构有3个主要的概念: Subject SecurityManager Realms 下面的关系图是关于这些组件是如何交互的高级概述. ...

最新文章

  1. Could not fetch URL https://pypi.org/simple/pip/
  2. JavaScript 设计模式基础(二)
  3. 【知识星球】softmax损失相关的小问题
  4. hdu 5624 KK's Reconstruction(最小生成树)
  5. 备战“双11”,阿里云为企业提供一站式资源保障服务
  6. JPDL3.1规范手册
  7. java 二叉树特点_疯狂java笔记之树和二叉树
  8. 数组的升序排序 字符串的方法 0308
  9. HDSF主要节点解说(二)工作原理
  10. iis同时运行django和php,使用Django同时运行UWSGI和ASGI
  11. [VB]使用ADOX创建Excel文件
  12. 让Cocos2dx中的TestCPP中的Box2dTest运行起来
  13. 拉普拉斯(逆)变换的计算
  14. OEIS A098928 数表扩充
  15. 日期转农历日期的一个插件
  16. 关于微信的几点更新与操作
  17. SpringBoot 雪花算法生成商品订单号【SpringBoot系列13】
  18. php自学建议_php自学提升进阶路线
  19. rospy基础--001_talker_listener
  20. 分享点22年计算机考研经验(反面)

热门文章

  1. Sentinel+Nacos实现Sentinel的持久化规则,就很nice!
  2. spring-bean依赖注入-02(通过p命名空间注入)
  3. 《数据结构与算法》课程设计任务书——赫夫曼编码/译码器
  4. Catch Overflow!
  5. 加密、解密、摘要、签名、证书一文搞懂
  6. ubuntu使用redis和宝塔面板
  7. mybatisplus的详细使用(自动填充,乐观锁,分页,条件查询)
  8. flash socket通信问题
  9. 后台开发人员面试内容——计算机网络(五)
  10. 排序算法——(1)简介