SpringMVC核心 - DispatcherServlet源码分析

一、SpringMVC原理

SpringMVC核心 - DispatcherServlet源码分析_第1张图片

  • 用户发送http请求 被DispatcherServlet接管(在web.xml里配置的)
  • 请求里有url路径 然后去servlet里面去找对应的方法 映射方法 就是找相应的handlermapping
  • 在controller里去找到对应url相应的方法 通过HandelAdapter处理 去返回一个ModeAndView
  • DispatcherServlet拿到完这个ModelAndView过后 然后通过ViewResolver去找相应的视图解析器(例如通过视图名字加一个前缀和后缀得到一个jsp路径)
  • 再生成相应的视图对象 再向这个视图对象里塞对象

二、DispatcherServlet初始化过程

首先,我们从大局出发,看一下DispatcherServlet的继承关系

    SpringMVC核心 - DispatcherServlet源码分析_第2张图片

从继承关系可以看出,DispatcherServlet就是一个Servlet,对Servlet有遗忘的可以参考下:Servlet生命周期。HttpServletBean继承了HttpServlet并重写了init()方法,

 

web.xml中配置了contextConfigLocation,HttpServletBean中使用ServletConfig进行读取配置文件中的参数

SpringMVC核心 - DispatcherServlet源码分析_第3张图片

然后在FrameworkServlet中对initServletBean()方法进行了重写实现

SpringMVC核心 - DispatcherServlet源码分析_第4张图片

我们再看initWebApplicationContext()方法,

 

SpringMVC核心 - DispatcherServlet源码分析_第5张图片

DispatcherServlet中对onRefresh(ApplicationContext context)方法进行了重写

SpringMVC核心 - DispatcherServlet源码分析_第6张图片

至此,就完成了DispatcherServlet的初始化,总结一下各个Servlet的作用:

1. HttpServletBean

  主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。

2. FrameworkServlet

  将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。

3. DispatcherServlet 

  初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

三、DispatcherServlet 是如何处理请求的

HttpServlet中提供了service方法处理请求,service方法中根据http请求方式调用对应的方法(比如:get请求调用doGet()方法,post请求调用doPost()方法),FrameworkServlet中对doGet()等方法进行了重写

SpringMVC核心 - DispatcherServlet源码分析_第7张图片

下面是processRequest()方法,

SpringMVC核心 - DispatcherServlet源码分析_第8张图片

SpringMVC核心 - DispatcherServlet源码分析_第9张图片

processRequest()方法中 doService()方法没有做任何处理,DispatcherServlet中对该方法进行了重写,最重要的就是里面的

doDisPatch(HttpServletRequest request,HttpServletResponse response)方法,该方法的功能如下:

首先根据请求的路径找到HandlerMethod(带有Method反射属性,也就是对应Controller中的方法),然后匹配路径对应的拦截器,有了HandlerMethod和拦截器构造个HandlerExecutionChain对象。HandlerExecutionChain对象的获取是通过HandlerMapping接口提供的方法中得到。有了HandlerExecutionChain之后,通过HandlerAdapter对象进行处理得到ModelAndView对象,HandlerMethod内部handle的时候,使用各种HandlerMethodArgumentResolver实现类处理HandlerMethod的参数,使用各种HandlerMethodReturnValueHandler实现类处理返回值。 最终返回值被处理成ModelAndView对象,这期间发生的异常会被HandlerExceptionResolver接口实现类进行处理。

四、总结

本文简单的DispatcherServlet的源码进行了分析,如有错误之处欢迎留言指出。欢迎关注微信公众号

SpringMVC核心 - DispatcherServlet源码分析_第10张图片

 

你可能感兴趣的:(SpringMVC源码系列)