DispatcherServlet处理过程及源码分析
第一步
寻找WebApplicationContext并将其作为一个属性绑定到请求上,这样Controller和其他元素在处理过程中就可以使用它。默认它是绑定在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE这个键上。
DispatcherServlet这个类里最重要的两个方法是doService()方法和doDispatch()。doService()方法在执行过程中调用了doDispatch()方法。
第二步
局部解析器也被绑定到请求上。如果你不需要局部解析,你也就不需要局部解析器。
第三步
将主题解析器绑定到请求上。如果不使用主题,也可以忽略。
第四步
如果配置了多部分文件解析器,那么请求就会被检查是否包含多部分。
这一步是由doDispatch()方法进行实现的。
如果找到多部分,则将该请求包装在MultipartHttpServletRequest中,以供流程中的其他元素进一步处理。这一部分体现在checkMultipart()方法内。
第五步
搜索适当的处理器(handler)。如果找到处理程序,则执行与处理程序(预处理器,后处理器和控制器)关联的执行链,以准备模型或进行渲染。另外,对于带注释的控制器,可以返回响应(在HandlerAdapter中),而不是返回视图。
上图代码:尝试获取Handler,如果获取失败(为null),抛出一个noHandlerFound异常
上图代码:执行链
第六步
如果返回模型,则呈现视图。如果没有返回任何模型(可能是由于预处理器或后处理器拦截了该请求,也可能出于安全原因),则不会呈现任何视图,因为该请求可能已经被满足。