web.xml中<context-param>与<init-param>的差别及各自的读取方式

Categories: Java; Tagged with: ; @ February 13th, 2009 19:40

事由: 最近几天看了点Servlet, 打算写一个小程序, 需要在application启动时从web.xml中加载一个参数, 由于仅在Login这个Servlet中使用, 于是我是这样实现的:

  
    
    Login
    Login
    com.insprise.servletstu.Login
    
      maxNumber
      maxNumber
      3
    
  
  
    Login
    /Login
  
  

然后在Login中重写init()方法, 如下:

Calc.MAX_CALCULATION_TIMES_PER_SESSION = Integer.parseInt(this.getInitParameter(Calc.MAX_CALCULATIONAS_PER_SESSION));

功能以实现, 将最大值从web.xml中读取出来, 赋值给一个Global的变量.

===============================承上启下的分割线==============================================

但随着学习的深入, 发现容器并不一定会保持Servlet一直存活, 也许会在Request介绍后Destory掉Login Servlet, 然后如果再次Request Login, 则会重新init(), 于是重新读取web.xml, 重新赋值–明显第一次有效的, 后面的都是无用功.

从逻辑上分析, 该最大值应属于ServletContext级别的数据, 于是应使用Listener, 监听Application初始化, 在Application初始化时读取.

于是我没有改动web.xml, 设置了监听函数:

    public void contextInitialized(ServletContextEvent sce) {
        log.info("Context Started!" + sce.getServletContext());
        ServletContext context = sce.getServletContext();
        Calc.MAX_CALCULATION_TIMES_PER_SESSION = Integer.parseInt(context.getInitParameter(Calc.MAX_CALCULATIONAS_PER_SESSION));
    }

但不论如何都会有NullPoint的错误. 于是意识到该应在web.xml使用<context-param>设定参数, 而非某个<Servlet>下的<init-param>标签. 修改后的web.xml:

 
           maxNumber
           3

=====================================总结性的分割线============================================

总而言之:

使用ServletContext.getInitParameter()方法 可以获得web.xml中的<context-param>参数 – 使用范围很广, 能getServletContext就可以使用.

在Servlet的init()函数中使用this.getInitParameter()获得web.xml的<init-param>参数 – 较为局限的参数. 注意逻辑上的层次划分



// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.