在上一篇文章Spring与MVC(二)中,我们分析了Spring MVC在启动过程中ContextLoaderListener
和DispatcherServlet
两个类的创建过程。
这篇文章中,我们来分析DispatcherServlet
初始化过程,以及DispatcherServlet
的处理请求过程。
DispatcherServlet
初始化过程
首先看一下DispatcherServlet
的继承关系。DispatcherServlet
继承自FrameworkServlet
,FrameworkServlet
继承自HttpServletBean
,HttpServeltBean
继承自Java的HttpServlet
。
HttpServletBean
用于将Servlet中配置的参数设置到相应的属性中。然后调用FrameworkServlet.initServletBean
,initServletBean
的主要工作是调用initWebApplicationContext()
初始化Spring MVC中所使用的WebApplicationContext:
1 | protected WebApplicationContext initWebApplicationContext() { |
首先,从ServletContext中获取WebApplicationContext。
回顾上一篇文章,在创建DispatcherServlet时,使用了我们创建的WebApplicationContext,因此这里的this.webApplicationContext
不为空,对其进行各种配置:设置ServletContext
、ServletConfig
、Namespace
、ApplicationListener
,最后调用refresh()
进行bean的各种初始化。其中,在最后的finishRefresh()
方法中,会通过事件的方式通知DispatcherServlet
初始化各个策略接口的实现类:
1 | protected void initStrategies(ApplicationContext context) { |
DispatcherServlet处理请求过程
HttpServlet提供了service方法用于处理请求,service使用了模板设计模式,在内部对于http get方法会调用doGet
方法,http post方法调用doPost
方法…
查看FrameworkServlet
代码,doGet
、doPost
等方法调用的是processRequest
方法,processRequest
方法调用DispatcherServlet.doService
执行service的任务,doService
委托给doDispatch
来做真正的请求分派工作:
1 | protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { |
首先,调用getHandler
方法获取HandlerExecutionChain
,其中包括了目标方法以及拦截器。然后通过handler获取HandlerAdapter
,使用HandlerAdapter
调用handler,得到ModelAndView
对象。最后调用processDispatchResult
方法渲染页面,处理前面调用抛出的异常。