spring源代码-DispatcherServlet

来源:互联网 发布:neflix 淘宝账号 编辑:程序博客网 时间:2024/06/05 12:39

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;    }}
原创粉丝点击