# 执行流程图
- 过程分析
用户发起请求some.do
DispatcherServlet
接收请求some.do,把请求转交给处理器映射器处理器映射器: 是springmvc框架中的一种对象,只要实现了
HandlerMapping
接口的类,都叫做映射器,存在多个作用:处理器映射器根据请求,从springmvc容器中获取处理器对象,也就是
Object o = context.getBean("bean`s id")
1框架会把找到的这个处理器对象放到一个叫做处理器执行链(
HandlerExecutionChain
)这个过程对应着
doDispatch()
方法中的,获取处理器执行链HandlerExecutionChain mappedHandler = this.getHandler(processedRequest);
1HandlerExecutionChain
类中保存着处理器对象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
中存放了控制器对象(当前请求对应的控制器对象)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
6DispatcherServlet
把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)中央调度器响应浏览器。
这个过程最好自己整理一下,可能面试会问到