讀取容器配置參數---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中的配置參數在整個應用程序裏都能被共享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章