读取容器配置参数—context-param和init-param区别

web.xml里面可以定义两种参数:
(1)application范围内的参数,存放在servletcontext中,在web.xml中配置如下:  <context-param>
<param-name>context/param</param-name>
<param-value>avalible during application</param-value>

<param-name>name1</param-name>
<param-value>value1</param-value>
</context-param>
(2)servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:

<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>com.wes.controller.MainServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>avalible in servlet init()</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
在servlet中可以通过代码分别取用:

package com.wes.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class MainServlet extends HttpServlet …{

public MainServlet() …{
super();
}
public void init() throws ServletException …{
System.out.println(“下面的两个参数param1是在servlet中存放的”);
System.out.println(this.getInitParameter(“param1″));
System.out.println(“下面的参数是存放在servletcontext中的”);
System.out.println(getServletContext().getInitParameter(“context/param”));
}
}

第一种参数在servlet里面可以通过getServletContext().getInitParameter(“context/param”)得到?(在servlet的init()方法中通过this.getInitParameter(“param1″)取得)
第二种参数只能在servlet的init()方法中通过this.getInitParameter(“param1″)取得

———————————————————————
ServletContextListener实现读取web.xml中context-param信息      2009年03月27日 星期五 22:37
用部署文件来存储配置参数在Java中是一种很流行的做法。

配置参数一般存放在context-param元素中,每一个context-param元素代表了一个键值对。

我们可以通过实现ServletContextListener接口读取该键值对中的值,在web应用程序初始化的时候,调用 ServletContextListener的contextInitialized()方法,所以我们我们可以重写该方法,实现读取操作。可以这样实现:

public class AppListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
try {

MyConfig config = new MyConfig();//存放配置信息,用Map实现
Enumeration parameters =  sce.getServletContext().getInitParameterNames();

while(parameters.hasMoreElements()){
String name =  (String) parameters.nextElement();
config.addKeyTValue(name, sce.getServletContext().getInitParameter(name));
}

//相应的键值对存到map中
config.addKeyValue(parameter, sc.getInitParameter(parameter));
}
} catch(Exception e) {
System.out.println(“com.shou error:” + e.getMessage());
}
}

public void contextDestroyed(ServletContextEvent arg0) {

}
}

MyConfig类:(Singleton Config)
package com.myapp;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
*
* @author Administrator
*/

public class MyConfig{
public static MyConfig myconfig;

public static HashMap config = new HashMap();

public static HashMap getConfig() {
return config;
}

public static MyConfig getInstance(){
if(myconfig==null){
myconfig = new MyConfig();

}
return myconfig;
}
public static void setConfig(HashMap config) {

MyConfig.config = config;
}

public HashMap addKeyTValue(String name,String value){
this.config.put(name, value);
return this.config;

}
}

接着,必须在web.xml中配置相应的监听类,才能在初始化的时候,自动调用该方法。如:

<listener>
<listener-class>com.myapp.MyListener</listener-class>
</listener>

这样就可以在任何一个JSP页面,通过EL表达式或JSTL读到context-param中的内容。

有的网友说在web.xml内定义<listener>元素时得注意下列两点:
<listener>元素必须出现在任何Context起始参数(由<context-param>元素所定义)之后。
<listener>元素必须出现在任何Servlet实体(由<servlet>元素所定义)之前。

但是我在TOMCAT5.5 + J2EE 5下配置web.xml并没有按照上述的严格限制也能成功读取信息。

难道是版本的问题吗。

在Struts 1.X下,通过一个自定义的Singleton Config类,可以让web.xml中的配置参数在整个应用程序里都能被共享。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>