web.xml是web项目启动时首先被容器读取的配置文件,根据其中的配置创建实例并完成参数初始化等以保证项目能够正确启动运行.web.xml中配置的项目主要有这么几种,我对各个元素的作用了解如下:
上下文参数:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/config/applicationContext-*.xml</param-value> </context-param>
这一元素用来声明应用范围(整个web项目)内的上下文初始化参数.参数名称是唯一的,就是固定不变的.在web.xml中通过contextConfigLocation配置spring,contextConfigLocation
参数定义了要装入的 Spring配置文件.如果缺省这种配置,默认加载/WEB-INF/applicationContext.xml文件,如果有多个,param-value里可以有多个配置文件名称,并以逗号分隔.
监听器:
<listener> <listener-class>com.tgb.itoo.MyListener</listener-class> </listener>
listener元素用来注册一个监听器类,listener-class指定监听类.
servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知.监听类继承ServletContextListener,在监听的类中有一个contextInitialized(ServletContextEventevent)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation")来得到context-param
设定的值.在这个类中还必须有一个contextDestroyed(ServletContextEventevent) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭.
过滤器:
<filter> <filter-name>setCharacterEncoding</filter-name> <filter-class>com.myTest.setCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GB2312</param-value> </init-param> </filter> <filter-mapping> <filter-name>setCharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
将一个名字与一个实现javax.servlet.Filter接口的类相关联. <url-pattern>定义Filter拦截的URL地址,说明拦截请求的方式.
servlet配置:
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc.xml,classpath:config/applicationContext-common.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
该元素指定了servlet的名称和servlet的类名称.Web服务器与Web应用属于两个范畴,要使我们的web应用在Web服务器上发布和运行,需要标准的中间接口,Servlet就是其中之一,所以这样的Web服务器也叫做Servlet容器.我们看到<servlet>中有<param-name>contextConfigLocation</param-name>的配置,而上面<context-param>中也有<param-name>contextConfigLocation</param-name>,虽然名称相同,但应用范围不同,分别是ServletConfig和ServletContext.具体差异之后的博客中会给出解释.
web.xml是如何被读取的以及容器读取配置文件过程中都进行了哪些操作,简单分析如下:
- 在启动Web项目时,容器(如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>
- 接着容器会创建一个ServletContext,整个WEB项目都能使用这个上下文
- 容器将读到的<context-param>转化为键值对,并交给ServletContext
- 容器创建<listener></listener>中的类实例,即创建监听
- 在监听的类中有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param
设定的值,还有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源 - 得到这个context-param的值之后,我们就可以做一些操作了.这时WEB项目还没有完全启动完成.
本文的重点在于明白以上各元素的基本配置,以及它们的加载顺序,即跟在web.xml文件中配置的先后无关,其顺序为context-param
->listener -> filter -> servlet.