SpringMVC请求处理流程
SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean、FrameworkServlet和 DispatcherServlet。
HttpServletBean直接继承自java的HttpServlet,其作用是将Servlet中配置的参数设置到相应的属性;
FrameworkServlet初始化了WebApplicationContext;
DispatcherServlet初始化了自身的9个组件。
/**
* This implementation calls {@link #initStrategies}.
*/
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
/**
* Initialize the strategy objects that this servlet uses.
* <p>May be overridden in subclasses in order to initialize further strategy objects.
*/
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
1.Fillter
2.org.springframework.web.servlet.DispatcherServlet#doDispatch
2.1 checkMultipart
2.2getHandler
HandlerMapping:处理映射器,根据请求的url映射到对应的处理器(Controller)的某个处理方法上,映射成功后返回一个HandlerExecutionChain对象(处理器执行链),其中包括处理器(Controller)以及拦截器。
遍历handlerMappings 获取 handler(真正用于执行方法的对象)
org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandler
2.3 getHandlerAdapter (根据handler获取HandlerAdapter 用于组织对象,用handler使用以及返回值的转换)
2.4 applyPreHandle
拦截器前置方法
2.5 handle
2.5.1 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle
2.5.1.1
org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest
a. getMethodArgumentValues
b. doInvoke
2.5.1.2 org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#handleReturnValue
遍历messageConverters进行转换
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#getModelAndView
2.6 applyPostHandle
拦截器
2.7 processDispatchResult
2.7.1异常解析
2.7.2 视图解析