zoukankan      html  css  js  c++  java
  • 基于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

  • 相关阅读:
    【JZOJ4807】破解
    输入挂(更新)
    Gorgeous Sequence(线段树)
    线段树套路系列
    hdu 3333 离线线段树 + 思维/树状数组 /在线主席树
    3183 RMQ / 贪心(坑成。。)
    hdu3594 强连通(仙人掌图)
    hdu3639 强连通
    hdu3861 强连通+最小路径覆盖
    图论--最小树形图朱刘算法模板
  • 原文地址:https://www.cnblogs.com/chengxuxiaoyuan/p/15746566.html
Copyright © 2011-2022 走看看