基于web.xml的web应用的启动过程

基于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-mappingurl-pattern配置的过滤器的执行顺序决定于它的配置顺序(filter-mapping的配置顺序)

多个用filter-mappingservlet-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

原文地址:https://www.cnblogs.com/chengxuxiaoyuan/p/15746566.html