学习java的人都知道春天,springMVC, mybatis等框架,像structs2这样的框架是基于servlet以外实现的,而springMVC是基于servlet容器实现的,
本文将分析SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程,让读者了解这个入口Servlet的作用。
在分析DispatcherServlet之前,我们先看下<强> DispatcherServlet的继承关系,强>
HttpSerlvetBean继承自HttpServlet。
<强> HttpServletBean覆写了初始化方法,对初始化过程做了一些处理。以下是初始化的代码:强>
首先,ServletConfigPropertyValues是HttpServletBean的静态类,构造过程会使用ServletConfig对象找出网络。xml文件中配置参数,并设置到ServletConfigPropertyValue,使用BeanWrapper来构造DispatcherServlet,获取ServletContextResourceLoader的资源加载器,然后注册资源编辑器,初始化BeanWrapper对象,设置DispatcherServlet属性,默认初始化ServletBean不做任何处理,子类覆盖该方法可以做任何事情,
以下是<强> web . xml >强文件配置:
这段配置初始化参数为contextConfigLocation,后来构造的是BeanWrapper对象,由于contextConfigLocation在FrameworkServlet中定义,但是没有在HttpServletBean中定义,利用春天的注入特性,只需要调用setContextConfigLocation方法,就可以将contextConfigLocation设置到对应的实例当中,然后设置DispatcherServlet中contextConfigLocation (FrameworkServlet中定义)的属性,为web . xml读取contextConfigLocation参数,该资源文件用构造SpringMVC的容器的上下文。
下面看下FrameworkServlet这个类,FrameworkServlet继承自HttpServletBean。
以下是<强> initServletBean >强的代码:
首先第一步是初始化WebApplicationContext,它是继承于ApplcationContext的接口,ApplcationContext是春容器的上下文,Servlet和春天容器关联的作用,然后初始化FrameWorkServlet,其实它空的,什么也做,子类重写这个方法,可以做任何处理,不过DispatcherServlet并重写这个方法。
下面是初始化<强> initWebApplicationContext 强>的具体实现逻辑:,
FrameworkServlet中有个字符串类型的contextAttribute的变量名,以它为关键在ServletContextWebApplicationContext,一般不会设置,contextAttribute属性,也就说,wac开始是零;接下来就是创建WebApplicationContext,并设置根上下文为父上下文,然后配置ServletConfig, ServletContext等到这个上下文,这个类中有个函数onReFresh是一个模版方法,在WebApplication成功创建后就会调用,FrameworkServlet的实现类,就会重写这个方法,并将创建的容器上下文设置到ServletContext中,这里的根上下文是web . xml中配置的ContextLoaderListener监听器中根据contextConfigLocation路径生成的上下文。
比如这段配置文件中根据类路径:- * . xml上下文下的xml文件生成的根上下文。
接着看一下DispatcherServlet重写了FrameworkServlet中onReFresh方法,
可以看到initStrategies方法中,在初始化各种各种策略接口的实现类,后面再一一分析各个策略接口的实现的详细介绍。
<强>总结一个三个类的作用:强>
<强> DispatcherServlet请求处理过程:强>
先看下HttpServlet提供的方法用于处理请求,服务使用了模版模式,对于HttpServlet的得到请求,调用doGet方法,文章请求,调用doPost方法........