ouyang9r 发表于 2022-3-14 23:15

web.xml的加载过程

## web.xml的加载过程

1. WEB容器(JBoss、Tomcat等)首先去项目的配置文件`web.xml`中读取`<listener/>`和`<context-param/>`节点
2. WEB容器创建一个`ServletContext`(servlet上下文application),这个web项目的所有部分都将共享这个上下文。
3. WEB容器将`web.xml`中的`<context-param/>`的`<param-name>`作为键、`<param-value>`作为值,转换为键值对,并存入`ServletContext`
   
    ```xml
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    ```
   
4. WEB容器读取并创建`web.xml`中的`<listener>`中的类路径`<listener-class>`,创建监听器(Listener),启动Web应用时,系统将调用Listener的`contextInitialized(ServletContextEvent args)`初始化方法。
   
    ```xml
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    ```
   
    - 在监听器中可以通过`application.getInitParameter("<param-name>");`获取 `<param-value>`
5. WEB容器读取并创建`web.xml`中的`<filter>`中的类路径`<filter-class>`,创建过滤器(Filter)。
   
    ```xml
    <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
      </init-param>
    </filter>
   
    <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    ```
   
6. 以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟。
7. 对于某类元素而言,与它们出现的顺序是有关的。以<filter>为例,web.xml中当然可以定义多个<filter>,与<filter>相关的一个元素是<filter-mapping>,**注意:**对于拥有相同<filter-name>的<filter>和<filter-mapping>元素而言,<filter-mapping>必须出现在<filter>之后,否则当解析到<filter-mapping>时,它所对应的<filter-name>还未定义。web容器启动初始化每个<filter>时,按照<filter>出现的顺序来初始化的,当请求资源匹配多个<filter-mapping>时,<filter>拦截资源是按照<filter-mapping>元素出现的顺序来依次调用doFilter()方法的。<servlet>同<filter>类似,此处不再赘述。

```xml
<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">

    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--1. ContextLoaderListener监听器-->
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
      <servlet-name>DispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
      <servlet-name>DispatcherServlet</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
   
    <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
      </init-param>
    </filter>

    <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
```

i12cyou 发表于 2022-3-15 01:31

牛哇牛哇,分析的很透彻

我今天是大佬 发表于 2022-3-15 08:49

感谢分享, 虽然java这一块看不太懂

zhaotaocan 发表于 2022-3-15 10:15

学习了,一直没弄明白这个具体是干啥的,反正就是复制粘贴

jllovecy 发表于 2022-3-15 10:20

学到了,非常实用
页: [1]
查看完整版本: web.xml的加载过程