DispatcherServlet是一个Servlet,我们知道在Servlet在处理一个请求的时候会交给service方法进行处理,这里也不例外,DispatcherServlet继承了FrameworkServlet,首先进入FrameworkServlet的service方法:
HttpServlet中会根据请求类型的不同分别调用doGet或者doPost等方法,FrameworkServlet中已经重写了这些方法,在这些方法中会调用processRequest进行处理,在processRequest中会调用doService方法,这个doService方法就是在DispatcherServlet中实现的。
下面就看下DispatcherServlet中的doService方法的实现。
请求到达DispatcherServlet
doService方法:
DispatcherServlet开始真正的处理,doDispatch方法:
可以看到大概的步骤还是按照我们上面分析的走的。
查找请求对应的Handler对象
对应着这句代码mappedHandler = getHandler(processedRequest, false);,看下具体的getHandler方法:
继续往下看getHandler:
继续往下看getHandler,在AbstractHandlerMapping类中:
根据requrst获取handler
首先看下根据requrst获取handler步骤getHandlerInternal方法,在AbstractHandlerMethodMapping中:
看下根据路径寻找handler的方法lookupHandlerMethod:
获取默认Handler
如果上面没有获取到Handler,就会获取默认的Handler。如果还获取不到就返回null。
处理String类型的Handler
如果上面处理完的Handler是String类型的,就会根据这个handlerName获取bean。
封装Handler执行链
上面获取完Handler,就开始封装执行链了,就是将我们配置的拦截器加入到执行链中去,getHandlerExecutionChain:
获取对应请求的Handler适配器
getHandlerAdapter:
缓存的处理
也就是对last-modified的处理
执行拦截器的preHandle方法
就是遍历所有的我们定义的interceptor,执行preHandle方法
使用Handler适配器执行当前的Handler
ha.handle执行当前Handler,我们这里使用的是RequestMappingHandlerAdapter,首先会进入AbstractHandlerMethodAdapter的handle方法:
handleInternal方法,在RequestMappingHandlerAdapter中:
组装默认视图名称
前缀和后缀名都加上
执行拦截器的postHandle方法
遍历intercepter的postHandle方法。
处理最后的结果,渲染之类的
processDispatchResult方法:
重点看下render方法,进行渲染:
view.render就是进行视图的渲染,然后跳转页面等处理。
到这里大概的流程就走完了。其中涉及到的东西还有很多,暂先不做详细处理。