zoukankan      html  css  js  c++  java
  • SpringMVC工作原理2(代码详解)

              

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

  • 相关阅读:
    [leetcode-648-Replace Words]
    [leetcode-647-Palindromic Substrings]
    [leetcode-646-Maximum Length of Pair Chain]
    [leetcode-645-Set Mismatch]
    [leetcode-459-Repeated Substring Pattern]
    [leetcode-636-Exclusive Time of Functions]
    [leetcode-644-Maximum Average Subarray II]
    iOS开发之使用XMPPFramework实现即时通信(三)
    Oracle 内置sql函数大全
    Oracle 中的sql函数以及分页
  • 原文地址:https://www.cnblogs.com/jing99/p/6280329.html
Copyright © 2011-2022 走看看