请求过来先遇见中央调度器(前端调度器)前端
//Determine handler for the current request; 对当前请求决定交给哪一个handler, 当前请求地址过来app
处理器执行链处理请求,接着咱们去找getHandler的实现this
hm是HandlerMapping对象,下图选定位置调用HandlerMapping的getHandler()方法经过请求找到Handler,可是返回值为HandlerExecutionChain(执行链)spa
这个servlet所支持的处理器映射器的集合,这里有N个处理器映射器。hm就是指HandlerMapping ,下面的if中的代码是指记录日志,日志跟踪。HandlerMapping处理器映射器中有N个拦截器,处理客服端请求的处理器只有一个,就是handler处理器。日志
getHandler咱们跟进去,对象
看过来的handler是否是执行链,要是就把handler强转成执行链,若是不是我new出一个执行链而且把handler给执行链。blog
HandlerInterceptor是处理器的拦截器。并且不是一个是多个拦截器(this.adaptedInterceptors),而后作了一个操做。若是当期拦截器,是映射用的拦截器,就把他给强转成处理器映射器。get
而后作了一个匹配,和查找的路径作匹配。而后加到了执行链拦截器中。那么若是不是就直接用一个的参数来添加。全部能够看出HandlerExecutionChain中只包含一个handler。包含N个拦截器。在把这个对象返回给了中央调度器。servlet
HandlerMapping总结:io
DispatcherServlet
--->doDispatcher()
---->getHandler(request):
---->HandlerExecutionChain
------> hm.getHandler(request)-----》方法体中
----->ExecutionChain executionChain = getHandlerExecutionChain(handler, request);
----->new HandlerExecutionChain(handler)
----->chain.addInterceptor(interceptor);
HandlerMapping:处理器映射器
做用:根据【请求】找到【处理器Handler】,但并非简单的返回处理器,而是
将处理器和拦截器封装,造成一个处理器执行链(HandlerExecuteChain)。
4.DispatcherServlet 拿着执行链去寻找对应的处理器适配器(HandlerAdapter)
为何要引入适配器?
由于处理器(Handler)有不少种,DispatcherServlet没办法统一管理,因此出现了适配器。
让适配器统一处理Handler,而DispatcherServlet统一处理适配器。
根据请求去找对应的handler