一、SpringMVC原理
- 用户发送http请求 被DispatcherServlet接管(在web.xml里配置的)
- 请求里有url路径 然后去servlet里面去找对应的方法 映射方法 就是找相应的handlermapping
- 在controller里去找到对应url相应的方法 通过HandelAdapter处理 去返回一个ModeAndView
- DispatcherServlet拿到完这个ModelAndView过后 然后通过ViewResolver去找相应的视图解析器(例如通过视图名字加一个前缀和后缀得到一个jsp路径)
- 再生成相应的视图对象 再向这个视图对象里塞对象
二、DispatcherServlet初始化过程
首先,我们从大局出发,看一下DispatcherServlet的继承关系
从继承关系可以看出,DispatcherServlet就是一个Servlet,对Servlet有遗忘的可以参考下:Servlet生命周期。HttpServletBean继承了HttpServlet并重写了init()方法,
web.xml中配置了contextConfigLocation,HttpServletBean中使用ServletConfig进行读取配置文件中的参数
然后在FrameworkServlet中对initServletBean()方法进行了重写实现
我们再看initWebApplicationContext()方法,
DispatcherServlet中对onRefresh(ApplicationContext context)方法进行了重写
至此,就完成了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()等方法进行了重写
下面是processRequest()方法,
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的源码进行了分析,如有错误之处欢迎留言指出。欢迎关注微信公众号