图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 就是进行了转发  然后整个流程就已经走完了!!!

posted on 2017-01-12 23:35  kosamino  阅读(285)  评论(0编辑  收藏  举报