博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC工作原理2(代码详解)
阅读量:5282 次
发布时间:2019-06-14

本文共 1358 字,大约阅读时间需要 4 分钟。

          

                           图1.流程图

 

1.当一个请求(request)过来,进入DispatcherServlet中,里面有个方法叫 doDispatch()方法 里面包含了核心流程

源码如下:

4.然后往下看getHandler():(DispatcherServlet.Java

  mapperHandler是  HandlerExecutionChain (处理器调用链) 类。

  HandlerExecutionChain 包含了处理器对象以及和处理器相关的拦截器,有目标方法和Handler。

  HandlerMapping 获取HandlerExecutionChina对象   源码的1120行(DispatcherServlet.java)。

  这里 1115行的 Handlermapping 定义了请求到处理器之间的映射,请求找到处理器就需要用到HandlerMapping。

5.上面的代码执行完后又返回到932行,继续执行:

  这里将出现三种情况:

  一、当请求的url路径不存在时(没有对应的requestmapping注解方法)

  如果发的请求的映射是空的。返回的HandlerExecutionChain、mappedHandler对象为空表示没有对应的映射

执行noHandlerFound方法

  经过这个方法  表示没有页面并且会进入404 错误页面

二、 当请求的路径url不存在时(没有对应的requestmapping注解方法),applicationcontext.xml中存在以下注解时:

  经过上面的配置 则 getHandler()不是null,因为加上以上的配置,会调用SimpleUrlHandlerMapping 去寻找本地的静态资源,如css、js 等但是同样的路径不存在跳转到404页面。

三、如果存在映射,继续执行之后的代码:

 

6.执行到上面这行getHandlerAdapter()

  HandlerAdapter(Handler适配器)

  这个类进行了很多操作,比如表单到实体Bean的赋值,通过Binner进行了 数据的绑定。

 

7.继续执行:954行preHandle().

这里呢,底层调用了拦截器的 PreHandle方法,如图:

 

8.然后继续执行到代码 959行(DispatcherServlet.java),handle()方法。

  这里呢就返回了一个ModelAndView,如果所示.

9.随后代码继续执行 调用了拦截器的postHandler()方法 ,然后调用ProcessDispatchResult方法,如下图:

 

继续执行

 

  然后继续执行 一直到代码 1027行(DisPatcherServlet.java)

10.这里就是已经在渲染视图了render()方法

这里通过在applicationcontext.xml中配置的视图解析器 进行了引用然后将页面进行了转发,

上面的 rd.forward 就是进行了转发  然后整个流程就已经走完了!!!

转载于:https://www.cnblogs.com/jing99/p/6280329.html

你可能感兴趣的文章
ubuntu16.04卸载mysql5.7安装mysql5.6
查看>>
B/S架构和C/S的差别
查看>>
python列表和元组相互转换
查看>>
Python利用递归计算年龄
查看>>
Docker容器/镜像查看及删除操作
查看>>
MySQL主从复制与主主复制
查看>>
info.plist常见属性
查看>>
__setup宏简介
查看>>
转:myeclipse 8.x 插件安装方法终极总结
查看>>
几种情况发生装箱
查看>>
linq to sql语句中转换数据类型和日期操作
查看>>
LeetCode:Climbing Stairs
查看>>
[XAML]命名空间xmlns
查看>>
oracle 不同表空间的数据迁移
查看>>
《The Benefit of Group Sparsity》
查看>>
浅析PHP反序列化漏洞之PHP常见魔术方法(一)
查看>>
【SICP练习】14 练习1.20
查看>>
tomcat性能优化Server——Connector
查看>>
git生成key
查看>>
java之aop
查看>>