web.xml文件中配置context-param与init-param的区别

时间:2022-12-06 13:23:28

web工程大多都需要配置web.xml文件,web.xml文件主要用来配置Listener、Filter、Servlet等。web.xml文件包括xml文件头,DOCTYPE声明,web-app元素。

web.xml的加载过程(引用)

在web-app元素内,元素的配置顺序与工程的加载顺序无关,web.xml的加载过程为:

  1. 启动一个web项目,web容器(如tomcat)读取web.xml文件,读取其中的配置信息
  2. 容器创建一个servlet上下文(servletContext),这个web项目所有部分共享这个上下文
  3. 容器将<context-param>转换为键值对,交给servletContext
  4. 容器创建<listener>中的监听器实例
  5. 触发contextInitialized方法,listener被调用(当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法contextInitialized;contextDestroyed,web.xml有contextLoaderListener监听器,spring等框架实现了本监听器的接口方法)
  6. 调用完contextInitialized方法后,容器再对filter初始化
  7. 容器对web.xml中的指定load-on-startup的值时,
    1. 当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet。

    2. 如果值小于0或未指定时,则表示只有在第一次请求的容器才在该servlet调用初始化函数(springMVC的初始化为此阶段

    3. 正值越小,(优先级1,2,3...->递减)servlet的优先级越高,应用启动时就越先加载。

    4. 值相同时,容器就会自己选择顺序来加载。

结论:web.xml 的加载顺序:

ServletContext -> context-param(无顺序)-> listener(无顺序)-> filter(书写顺序) -> servlet(load-on-startup优先级)

web.xml文件中配置<context-param>和<init-param>的区别

<context-param>和<init-param>都是上下文参数,但它们的范围和使用方式不同。

<context-param>是application范围内的初始化参数,用于向servlet-context提供键值对,即应用程序的上下文信息,listener、filter等初始化时会用到这些信息

<init-param>是servlet范围内的参数,只能在servlet类的init()方法中取得

<context-param>    
           <param-name>context/param</param-name>    
           <param-value>avalible during application</param-value>    
</context-param>    
<servlet>    
    <servlet-name>TestServlet</servlet-name>    
    <servlet-class>com.xxx.xxx.TestServlet</servlet-class>    
    <init-param>    
       <param-name>initParam</param-name>    
       <param-value>avalible in servlet init()</param-value>    
    </init-param>    
    <load-on-startup>0</load-on-startup>    
</servlet> 
public class TestServlet extends HttpServlet {    
    public TestServlet() {    
        super();    
      }    
    public void init() throws ServletException {    
          System.out.println(this.getInitParameter("initParam"));    
          System.out.println(getServletContext().getInitParameter("context/param"));    
       }    
}