基于web.xml的web应用的启动过程
一、一个标准的web.xml
先来看下一个标准的web.xml中都配置了哪些内容
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<listener>
<listener-class>com.lyy.listener.MyServletContextListener</listener-class>
</listener>
<context-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123</param-value>
</context-param>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.lyy.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.lyy.filter.MyFilter</filter-class>
<init-param>
<param-name>filterName</param-name>
<param-value>fff</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
从上到下,分别配置了
1.1 listener
listener,这个标签中配置的类必须是ServletContextListener
这个类的实现类,该接口能够用来监听ServletContext 对象的生命周期,当web容器启动或终止的时候,会触发ServletContextEvent 事件,该事件会由这个接口的实现类来处理。这个接口中分别定义了两个对应容器启动和终止时间的方法
1.2 context-param
这个标签下配置的是上下文参数,这个标签下配置的参数会被挂在ServletContext对象上,整个应用内都可以使用
1.3 servlet
这里配置servlet,容器启动的时候是否初始化servlet取决于load-on-startup
的配置,当值为0或者大于0时,表示容器启动时就初始化,当是负数或者没配置时,启动容器时不会初始化,第一次访问该servlet时会进行初始化。
配置多个servlet时,这个参数的值越小的越早启动。
1.4 filter
这个标签用来配置过滤器,
多个用filter-mapping
的url-pattern
配置的过滤器的执行顺序决定于它的配置顺序(filter-mapping的配置顺序)
多个用filter-mapping
的servlet-name
配置的过滤器的执行顺序决定于它的配置顺序(filter-mapping的配置顺序)
用url-pattern配置的过滤器会比用servlet-name配置的过滤器先执行。
二、web.xml的加载过程
(1) 启动一个web工程的时候,web容器(tomcat)会去加载web.xml文件,读取listener和context-param这两个标签
(2) 容器会创建一个ServletContext对象,这个对象整个应用范围内都可以使用,然后会把context-param标签中配置的参数加到这个对象中,所以其他地方就可以获取到
(3) 容器创建listener标签中配置的监听器的类,当ServletContextEvent
事件被触发的时候,这个监听器类中对应的方法就会被执行。
(4) 容器创建并初始化filter
(5) 根据load-on-startup
的配置,决定是否初始化servlet
所以web.xml的总的加载顺序是这样的
context-param>listener>filter>servlet