web.xml是部署描述文件,它不是Spring所特有的,而是在Servlet规范中定义的,是web应用的配置文件。web.xml主要是用来配置欢迎页、servlet、filter、listener等以及定制servlet、JSP、Context初始化参数。
启动一个WEB项目时,容器(包括JBoss、Tomcat等)首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。
Spring容器技术通过web.xml与web容器耦合。读取Web.xml就可以获取Spring容器的初始化信息。
加载流程
context-param -> listener -> filter -> servlet

- 读取
和 - 创建全局共享的ServletContext【ServletContext是容器的宿主环境】
- 将
配置转化为键值对,存入ServletContext
<context-param> <param-name>contextConfigLocationparam-name> <param-value>/WEB-INF/applicationContext.xmlparam-value> context-param>
-
创建
中的类实例
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener listener-class> listener>
- 读取
,根据指定的类路径来实例化过滤器
<filter> <filter-name>encodingFilterfilter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter filter-class> <init-param> <param-name>encodingparam-name> <param-value>utf-8param-value> init-param> <init-param> <param-name>forceEncodingparam-name> <param-value>trueparam-value> init-param> filter> <filter-mapping> <filter-name>encodingFilterfilter-name> <servlet-name>springmvcservlet-name> filter-mapping>
-
如果系统中有
,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求【使用 1 可以控制servlet在容器加载时就被实例化】
<servlet> <servlet-name>springmvcservlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet servlet-class> <load-on-startup>1load-on-startup> servlet> <servlet-mapping> <servlet-name>springmvcservlet-name> <url-pattern>/url-pattern> servlet-mapping>
总结:ServletContext是WebApplicationContext的底层支撑,所有的外界配置信息读到ServletContext中,然后再通过ContextLoaderListener触发Spring根上下文的初始化
加载细节
