解析web.xml加载流程
web项目在Tomcat启动的时候,会去读取web.xml的配置,只有这一步正常完成,项目才能正常启动。
以如下web.xml作为例子说明web.xml加载流程
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
-
将的值加载到servlet context中(作为键,作为值)
-
接着加载listener,创建ContextLoaderListener监听器实例,并且调用contextInitialized方法,这个方法有一个ServletContextEvent event参数,可以根据这个参数event.getServletContext()获取servletcontext,从而可以获取加载的值。ContextLoaderListener的contextInitialized方法调用initWebApplicationContext方法(继承自WebApplicationContext),initWebApplicationContext方法从servlet context中根据contextConfigLocation获取spring配置文件路径classpath:applicationContext.xml,加载这个spring配置文件。
-
创建filter的实例,这里是CharacterEncodingFilter,作用是设置请求的字符类型(content-type)为utf-8。
-
创建DispatcherServlet实例,获取contextConfigLocation定义的springmvc配置文件的路径,读取配置文件
5. 关闭Tomcat时,会依次调用servlet、filter和ContextLoaderListener的销毁方法。(ContextLoaderListener的contextDestroyed方法)