# 执行流程图

- 过程分析
- 用户发起请求some.do 
- 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 interceptors1
 2- 所以处理器执行链 - HandlerExecutionChain中存放了控制器对象(当前请求对应的控制器对象)
- 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 
- DispatcherServlet把3中获取的- ModeAndView交给视图解析器对象- 视图解析器:springmvc中的对象,需要实现 - ViewResoler接口(可以存在多个)- View是一个接口,表示视图的,在框架中jsp,HTML不是String表示,而是使用- View和他的实现类表示视图- InternalResourceView:视图类,表示jsp文件,视图解析器会创建- InternalResourceView对象,这个对象里面存在属性- url = .....*jsp,路径
- DispatcherServlet把4步骤中创建的View对象获取到,调用view类中的方法,把Model数据放入到requers作用域中,执行视图的forward,现在请求就已经结束了
(1)浏览器提交请求到中央调度器
(2)中央调度器直接将请求转给处理器映射器。
(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后
返回给中央调度器。
(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。
(5)处理器适配器调用执行处理器。
(6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给
处理器适配器。
(7)处理器适配器直接将结果返回给中央调度器。
(8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
(9)视图解析器将封装了的视图对象返回给中央调度器
(10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。
(11)中央调度器响应浏览器。
这个过程最好自己整理一下,可能面试会问到
