SpringMVC工作流程分析
2017-01-07 17:02
363 查看
http://blog.csdn.net/lu1005287365/article/details/52287952
模拟一个请求 从代码上 简单说说 SpringMVC一个请求得流程
先来个图
当一个请求(request)过来,进入DispatcherServlet中,里面有个方法叫 doDispatch方法 里面包含了核心流程
(由3到4,中间为什么要有个HandlerAdapter?因为,springmvc的handler)
源码如下:
然后往下看:(DispatcherServlet.Java)
mapperHandler是 HandlerExecutionChain (处理器调用链) 类
HandlerExecutionChain 包含了 处理器对象 以及和处理器相关的 拦截器。 有目标方法 和 Handler
HandlerMapping 获取HandlerExecutionChina对象 源码的1120行(DispatcherServlet.java)。
这里 1115行的 Handlermapping 定义了请求到处理器之间的映射 请求找到处理器 就需要用到HandlerMapping
上面的代码执行完 后 又返回到 932行 继续执行
这里将出现三种 情况:
一、当请求的url路径不存在时(没有对应的requestmapping注解方法)
如果发的请求的映射是空的。返回的HandlerExecutionChain mappedHandler对象为空表示没有对应的映射
执行noHandlerFound方法
经过这个方法 表示没有页面 并且 会进入404 错误页面。
二、 当请求的路径url不存在时(没有对应的requestmapping注解方法),applicationcontext.xml中存在以下注解时:
经过上面的配置 则 getHandler() 不是null 因为 加上以上的配置,会调用SimpleUrlHandlerMapping 去寻找本地的静态资源,如css js 等 但是 同样的路径不存在 跳转到404页面
三、如果存在映射,继续执行之后的代码:
执行到上面这行:
HandlerAdapter(Handler适配器)
这个类 进行了 很多操作,比如表单到实体Bean的赋值,通过Binner进行了 数据的绑定。
继续执行:954行
这里呢 底层 调用了拦截器的 PreHandle方法,如图:
然后继续执行 到 代码 959行(DispatcherServlet.java)
这里呢就返回了一个ModelAndView,如果所示.
随后代码继续执行 调用了 拦截器的 PostHandler方法 ,然后调用 ProcessDispatchResult方法,如下图:
继续执行
然后继续执行 一直到 代码的 1027行(DisPatcherServlet.java)
这里就是已经在渲染视图了render() 方法
这里 通过在applicationcontext.xml中配置的视图解析器 进行了引用 然后将页面进行了转发,
上面的 rd.forward 就是进行了转发 然后整个流程就已经走完了!!!
模拟一个请求 从代码上 简单说说 SpringMVC一个请求得流程
先来个图
当一个请求(request)过来,进入DispatcherServlet中,里面有个方法叫 doDispatch方法 里面包含了核心流程
(由3到4,中间为什么要有个HandlerAdapter?因为,springmvc的handler)
源码如下:
然后往下看:(DispatcherServlet.Java)
mapperHandler是 HandlerExecutionChain (处理器调用链) 类
HandlerExecutionChain 包含了 处理器对象 以及和处理器相关的 拦截器。 有目标方法 和 Handler
HandlerMapping 获取HandlerExecutionChina对象 源码的1120行(DispatcherServlet.java)。
这里 1115行的 Handlermapping 定义了请求到处理器之间的映射 请求找到处理器 就需要用到HandlerMapping
上面的代码执行完 后 又返回到 932行 继续执行
这里将出现三种 情况:
一、当请求的url路径不存在时(没有对应的requestmapping注解方法)
如果发的请求的映射是空的。返回的HandlerExecutionChain mappedHandler对象为空表示没有对应的映射
执行noHandlerFound方法
经过这个方法 表示没有页面 并且 会进入404 错误页面。
二、 当请求的路径url不存在时(没有对应的requestmapping注解方法),applicationcontext.xml中存在以下注解时:
经过上面的配置 则 getHandler() 不是null 因为 加上以上的配置,会调用SimpleUrlHandlerMapping 去寻找本地的静态资源,如css js 等 但是 同样的路径不存在 跳转到404页面
三、如果存在映射,继续执行之后的代码:
执行到上面这行:
HandlerAdapter(Handler适配器)
这个类 进行了 很多操作,比如表单到实体Bean的赋值,通过Binner进行了 数据的绑定。
继续执行:954行
这里呢 底层 调用了拦截器的 PreHandle方法,如图:
然后继续执行 到 代码 959行(DispatcherServlet.java)
这里呢就返回了一个ModelAndView,如果所示.
随后代码继续执行 调用了 拦截器的 PostHandler方法 ,然后调用 ProcessDispatchResult方法,如下图:
继续执行
然后继续执行 一直到 代码的 1027行(DisPatcherServlet.java)
这里就是已经在渲染视图了render() 方法
这里 通过在applicationcontext.xml中配置的视图解析器 进行了引用 然后将页面进行了转发,
上面的 rd.forward 就是进行了转发 然后整个流程就已经走完了!!!
相关文章推荐
- acegi流程分析之一《Acegi 中的HttpSessionEvent 监听机制 窥视Acegi的 工作流程》 (zz)
- Nutch Crawler工作流程及文件格式详细分析
- surfaceflinger 工作流程分析
- 搜索引擎分析系列2-搜索引擎工作的基础流程与原理
- struts2工作流程(从九个步骤来分析)
- 项目代理工作手册II(工作流程+收益分析)——CSDN外包实践(40)
- Yii源码分析——yii整个工作流程
- zeromq源代码分析1------基本工作流程分析
- InnoDB存储引擎(engine)主线程(master thread)工作流程分析
- FFMPEG-0.11.1分析之ffmpeg结构(简单涉及)与代码流程(主要涉及前部分的准备工作)
- 对struts工作流程的分析
- Nutch Crawler工作流程及文件格式详细分析
- Nutch爬虫工作流程及文件格式详细分析
- Nutch Crawler工作流程及文件格式详细分析
- Maximo工作流程相关表结构分析与工作流迁移脚本
- [Java] oscache 多线程 工作流程的分析
- 分析Nutch的工作流程
- 转:Nutch Crawler工作流程及文件格式详细分析
- pushlet工作流程分析与研究
- WordCount工作流程分析与总结