DispatcherServlet遵循原始servlet的生命周期,init,service,destory
init(初始化)
通过HttpServletBean、FrameworkServlet、DispatcherServlet三个不同的类层次,SpringMVC的设计者将三种不同的职责分别抽象,运用模版方法设计模式分别固定在三个类层次中。
HttpServletBean : 完成的是<init-param>配置元素的依赖注入
FrameworkServlet :
(1)完成的是容器上下文的建立,即webApplicationContext,我们知道应用在加载加载spring的时候,已经初始化了一个webApplicationContext,现在又来一个context,这两个context为父子关系,spring-mvc对应的context为子,可以通过getParent拿到spring的context
(2)上下文建立的过程中,实例并且初始化核心的bean,比如RequestMappingHandlerMapping ,这个mapping会循环所有的controller及其方法,生成path到method的映射,注册到mapping中。
DispatcherServlet:
完成spring-mvc的请求处理和相应到核心组件的初始化
initHandlerMapping,初始化handlerMapping,从bean工厂中获取handlerMapping,放到DispatcherServlet中
service(请求处理和相应)
请求进行路由,获取对应的handler,并执行
循环handlerMapping,找到url对应的HandlerExcutionChain,生成requestMappingHandlerAdapter,调用handle方法,在handle方法中new出ServletInvocableHandlerMethod对象,执行invokeAndHandle,此时真正执行controller层的method
handle完成之后进行viewResolver,首先进行异常处理,这里给我们提供了扩展,下面介绍如何自定义异常处理器,对controller层的错误统一返回json,不返回错误页面
sping-mvc配置文件中配置
<bean class="com.fengjr.prizecenter.component.AjaxExceptionResolver"></bean>
/**
* Created by haoxu on 17/10/11.
*/ public class AjaxExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("isSuccess", false); modelAndView.setView(new FastJsonJsonView()); return modelAndView; } }