# 执行流程图

  • 过程分析
  1. 用户发起请求some.do

  2. DispatcherServlet接收请求some.do,把请求转交给处理器映射器

    处理器映射器: 是springmvc框架中的一种对象,只要实现了HandlerMapping接口的类,都叫做映射器,存在多个

    作用:处理器映射器根据请求,从springmvc容器中获取处理器对象,也就是

    Object o = context.getBean("bean`s id")
    
    1

    框架会把找到的这个处理器对象放到一个叫做处理器执行链(HandlerExecutionChain)

    这个过程对应着doDispatch()方法中的,获取处理器执行链

    HandlerExecutionChain mappedHandler = this.getHandler(processedRequest);
    
    1

    HandlerExecutionChain类中保存着处理器对象Controller,项目中所有的拦截器List<HandlerInterceptor>

    在执行doDispatch()方法的时候,HandleMapping对象中的集合

    [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@1033fc8c, org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@1ef400fa, org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@1acb97fc]
    
    1

    获取HandlerExecutionChain对象方法分析

    public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        Object handler = this.getHandlerInternal(request);
        if (handler == null) {
            handler = this.getDefaultHandler();
        }
    
    1
    2
    3
    4
    5

    从图中,可以看到,执行Object handler = this.getHandlerInternal(request);方法时,返回的对象就是控制器对象,并且对象中,保存了控制器对象中的方法,这个方法就是我们请求的时候,对应的那个方法

    最终

    HandlerExecutionChain mappedHandler = this.getHandler(processedRequest);
    //mappedHandler=HandlerExecutionChain with [vin.cco.controller.MyControllerParameter#doAuto(String, Integer)] and 2 interceptors
    
    1
    2

    所以处理器执行链HandlerExecutionChain中存放了控制器对象(当前请求对应的控制器对象)

  3. DispatcherServlet把2中的处理器执行链中的处理器对象交给适配器对象,存在多个

    处理器适配器:springmvc框架中的对象,需要实现HandlerAdapter接口

    作用:执行处理器方法(调用Controller类中的方法),从而通过方法得到返回值ModeAndView,这个过程就是

    HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
    
    //获取ModeAndView对象
    ModeAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    
    //结果ModelAndView [view="parameter"; model={name=sdf, age=2}]
    
    1
    2
    3
    4
    5
    6

  4. DispatcherServlet把3中获取的ModeAndView交给视图解析器对象

    视图解析器:springmvc中的对象,需要实现ViewResoler接口(可以存在多个)

    View是一个接口,表示视图的,在框架中jsp,HTML不是String表示,而是使用View和他的实现类表示视图

    InternalResourceView:视图类,表示jsp文件,视图解析器会创建InternalResourceView对象,这个对象里面存在属性url = .....*jsp,路径

  5. DispatcherServlet把4步骤中创建的View对象获取到,调用view类中的方法,把Model数据放入到requers作用域中,执行视图的forward,现在请求就已经结束了

(1)浏览器提交请求到中央调度器

(2)中央调度器直接将请求转给处理器映射器。

(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后

返回给中央调度器。

(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。

(5)处理器适配器调用执行处理器。

(6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给

处理器适配器。

(7)处理器适配器直接将结果返回给中央调度器。

(8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。

(9)视图解析器将封装了的视图对象返回给中央调度器

(10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。

(11)中央调度器响应浏览器。

这个过程最好自己整理一下,可能面试会问到