首先放一张大家都熟悉的springmvc工作流程图:
由此可见,springmvc中的核心就是这个DispatcherServlet,下面就从DispatcherServelt的源码分析(springmvc版本5.0.x),一步步弄明白springmvc
一. DispatcherServlet是什么
DispatcherServlet这个类的UML图如下:
可以看出:它是一个由spring ioc容器管理的一个servlet,只会被实例化一个对象。它是何时被实例化的呢?这要从它的父类FrameworkServlet说起,FrameworkServlet这个类就是servlet与springr容器的结合点。FrameworkServlet的初始化方法:initServletBean调用initWebApplicationContext()方法,将servert初始化并发布到IOC容器中:
二.DispatcherServlet的初始化
我们可以看到DispatcherServlet这个类有许多属性:public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
........
这些属性都是在定义的时候直接进行了初始化,而有一些我们熟知的属性,比如说:handlerMappings,handlerAdapters是怎么初始化的呢?答案在静态代码块中:
这个DispatcherServlet.properties文件中的内容,正是DispatcherServlet中定义而未初始化的属性全限定类名
DispatcherServlet类的初始化方法执行时,会给每一个在定义时没有进行初始化的属性进行赋值,完成初始化。实现方式是根据类型从IOC容器中取到相应的bean,再将这个bean赋值给属性
三.核心方法
doDispatch()--所有的http请求都会被此方法处理
1.遍历其持有的HandlerMapings,通过HandlerMapping获取到一个HandlerExecutorChain对象,HandlerExecutionChain mappedHandler = getHandler(processedRequest);HandlerChain对象包含这些属性:final Object handler、 HandlerInterceptor[] interceptors、List<HandlerInterceptor> interceptorList
2.根据1中的结果,拿到一个Handler(即我们程序员写的controller),再根据这个handler获取到接口类型HandlerAdapter:HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
3.根据2中的结果,进行请求处理,处理完成,返回一个ModelAndView:ModelAndView mv=ha.handle(processedRequest, response, mappedHandler.getHandler());再通过1中的interceptors对mv进行前置处理:
4.处理mv,返回结果:processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
如果返回的逻辑视图不为空,并且不包含任何model或者view(ModelAndView对象两个属性),则调用render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)方法,利用DispatcherServlet所持有的ViewResolver进行视图渲染:
ViewResolverc处理完mv之后,返回一个View接口,view调用自身render()方法,进行物理视图的渲染,返回给浏览器。
至此DispatcherServlet主要工作流程就介绍完毕