事由: 最近几天看了点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>参数 – 较为局限的参数. 注意逻辑上的层次划分
使用Eclipse打包Java工程成为Jar <->
// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.