参考网址:http://www.cnblogs.com/fangjian0423/p/springMVC-dispatcherServlet.html
https://www.cnblogs.com/hzj-/articles/1689836.html
https://blog.csdn.net/jixinhuluwa/article/details/48003203 感谢大佬!!!
前言:祭出springmvc 的架构图,自己又加工了一下。有错误的地方,请指正。
(1)介绍DispatcherServlet
DispatcherServlet是一个实际的Servlet(它从HttpServlet基类继承),需要在web.xml 中配置。
<!-- 前端控制器配置 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--加载springmvc.xml配置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- servlet映射 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
在tomcat启动后,这里设定了在启动的时候就加载(<load-on-startup>1</load-on-startup>),所以就会直接加载
DispatcherServlet,而设置的init-param 也会被使用到,所以spring-mvc.xml 就会被加载。
(1.1)DispatcherServlet初始化过程
参考网站:http://www.cnblogs.com/fangjian0423/p/springMVC-dispatcherServlet.html、
看下继承关系:
说明还是从HttpServlet基类继承,所以先关注init() 初始化方法。
1、httpServletBean
在httpServletBean 中重写了init方法:具体内容可以参考上面的那个文章,我这里直接演示debug过程。
这里就拿到了 initparam 设定的contextConfigLocation 的初始化参数和参数值。
下面还有这个方法:initServletBean(); 是在FrameworkServlet 进行重写的。
2、FrameworkServlet
<!-- 加载spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
这里就生成了根上下文也可以理解为spring容器上下文,下来就是将dispathcherservlet 和 spring 容器上下文关联。
onRefresh()方法由 DispatcherServlet 实现:
3、DispatcherServlet
很明显,initStrategies方法内部会初始化各个策略接口的实现类。
比如异常处理初始化initHandlerExceptionResolvers方法:SpringMVC异常处理机制详解
视图处理初始化initViewResolvers方法:SpringMVC视图机制详解
请求映射处理初始化initHandlerMappings方法:详解SpringMVC请求的时候是如何找到正确的Controller
总结一下各个Servlet的作用:
1. HttpServletBean
主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。
2. FrameworkServlet
将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。
3. DispatcherServlet
初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。
参考:http://www.cnblogs.com/fangjian0423/p/springMVC-dispatcherServlet.html