DispatcherServlet介绍
DispatcherServlet 就是一个servlet 类,无非就是包装起来根据url能够映射找到我们的springMVC中定义的请求方法。
DispatcherServlet 的继承关系
DispatcherServlet 继承 FrameworkServlet 继承 HttpServlet
面向对象基本思想:重写、先走父类,再走子类
所以:先看HttpServlet类再找到我们最后的子类
DispatcherServlet 源码流程分析
框架流程
SpringMVC 的执行流程
代码流程
HttpServlet
Service → 判断请求 如果Get请求 → FrameworkServle
DoGet_方法 → DispatcherServlet
doService方法→ doDispatch ();
这里重点看DispatcherServlet中的doDispatch()方法,下面介绍 doDispatch 方法都做了什么事。
1、执行doDispatch()方法
2、调用getHandler方法获取请求目标方法,也就是请求url映射路径对应的控制层具体的方法。
handlerMappings 的作用是查找控制器位置,比如 xml 和注解方式。
3、调用 getHandlerAdapter() 方法获取控制层适配器 RequestMappingHandlerAdapter
4、执行拦截器前置方法 applyPreHandle() 方法,如果返回true 的话接着往下执行目标方法。
有几个拦截器执行几个拦截器的前置方法。
5、执行实际请求目标方法,返回modeAndView对象
具体走哪一个Adapter?走父类的
最后底层通过invoke反射机制执行目标方法
6、执行拦截器 applyPostHandle() 方法
7、设置渲染视图层内容
8、执行拦截器 afterCompletion() 方法
springMVC 路径映射初始化原理
DispatcherServlet 中有一个方法初始化一些数据,如下:
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); //初始化上传文件解析器(或者是多部分请求解析器)
initLocaleResolver(context);//初始化本地化解析器
initThemeResolver(context);//初始化主题解析器
initHandlerMappings(context);//初始化处理器映射器
initHandlerAdapters(context);//初始化处理器适配器
initHandlerExceptionResolvers(context);//初始化处理器异常解析器
initRequestToViewNameTranslator(context);//初始化请求到视图名翻译器
initViewResolvers(context);//初始化视图解析器
initFlashMapManager(context);//初始化重定向数据管理器
}
上诉中方法在哪里执行的,如下图:
在 onRefresh 方法中执行了 initStrategies 方法
再接着向上找调用方法的方法
最后找到执行方法的源头init方法,所以,springmvc控制层是在servlet初始化时初始化的。
- HttpServletBean init() 方法。
- FrameworkServlet initServletBean 方法 → initWebApplicationContext() ;
- DispatcherServlet onRefresh 方法 → initStrategies() 方法。
initHandlerMappings 方法加载 url 路径映射。