1. 程式人生 > >淺談ServletContext

淺談ServletContext

一.ServletContext概述

WEB容器在啟動時,它會為每個WEB應用程式都建立一個對應的ServletContext物件,它代表當前web應用,伺服器開始,其就存在,伺服器關閉,其才釋放。
由於一個WEB應用中的所有Servlet共享同一個ServletContext物件,它是一個全域性的儲存資訊的空間,因此Servlet物件之間可以通過ServletContext物件來實現通訊。ServletContext物件通常也被稱之為context域物件

二.ServletContext中的常用方法

(1)Object getAttribute(String name) 返回servlet上下文中具有指定名字的物件,或使用已指定名捆綁一個物件。從Web應用的標準觀點看,這樣的物件是全域性物件,因為它們可以被同一servlet在另一時刻訪問。或上下文中任意其他servlet訪問。

(2)void setAttribute(String name,Object obj) 設定servlet上下文中具有指定名字的物件。

(3)Enumeration getAttributeNames() 返回儲存在servlet上下文中所有屬性名字的列舉。

(4)String getInitParameter(String name) 返回指定上下文範圍的初始化引數值。此方法與ServletConfig方法名稱不一樣,後者只應用於已編碼的指定servlet。此方法應用於上下文中所有的引數。

(5)Enumeration getInitParameterNames() 返回(可能為空)指定上下文範圍的初始化引數值名字的列舉值。

(6)InputStream getResourceAsStream 以 InputStream 物件的形式返回位於指定路徑上的資源

(7)String getRealPath 為給定虛擬路徑返回包含實際路徑的 String

三.ServletContext的三個功能

1.使用ServletContext物件讀取web專案中的資原始檔,共有兩種方式

(1)方式一:通過InputStream getResourceAsStream(java.lang.String path) :得到要操作檔案的輸入流

程式碼:
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //建立物件
Properties p=new Properties(); //得到ServletContext物件 ServletContext context=getServletContext(); //得到要操作的檔案的輸入流 //檔案放到src下面 InputStream in1=context.getResourceAsStream("/WEB-INF/classes/cn/itcast/ServletContext/db3.properties"); //檔案放到webroot下面 InputStream in2=context.getResourceAsStream("/db.properties"); //檔案放到包裡面 InputStream in3=context.getResourceAsStream("/WEB-INF/db1.properties"); p.load(in1); String url=p.getProperty("url"); String username=p.getProperty("username"); String password=p.getProperty("password"); System.out.println(url+":"+username+":"+password);

(2)方式二:String getRealPath(java.lang.String path) :得到要操作檔案的完全路徑(帶碟符的路徑)

    程式碼:
//得到ServletContext物件
        ServletContext context=getServletContext();
        //得到檔案的路徑
        String path=context.getRealPath("/db.properties");
        //得到要操作的檔案的輸入流
        InputStream in=new FileInputStream(path);

(3)另外可以通過方式三:使用類載入器讀取

程式碼:


//得到類的class
Class clazz=ServletDemo7.class;
//得到類的載入器
ClassLoader load=clazz.getClassLoader();
//得到要操作檔案的輸入流
InputStream in=load.getResourceAsStream("/db1.properties");

2.獲取全域性的初始化引數
(1)配置全域性初始化引數

    <context-param>
        <param-name>url</param-name>
        <param-value>localhost</param-value>
      </context-param>
(2)String getInitParameter(String name) :根據名稱得到全域性初始化引數的值
* 程式碼
        //得到servletContext物件
        ServletContext context = getServletContext();
        //根據名稱得到全域性初始化引數的值
        String url = context.getInitParameter("url");
        String name = context.getInitParameter("name");

         Enumeration getInitParameterNames()  :得到所有的全域性初始化引數的名稱
        * 程式碼
        //得到servletContext物件
        ServletContext context = getServletContext();
        //使用方法得到所有的全域性初始化引數的名稱
        Enumeration<String> enumrEnumeration = context.getInitParameterNames();
        //得到每個全域性初始化引數的名稱
        while(enumrEnumeration.hasMoreElements()) {
            String name = enumrEnumeration.nextElement();
            String value = context.getInitParameter(name);
            System.out.println(name+" :: "+value);
        }

3.多個Servlet通過ServletContext物件實現資料共享。ServletContext物件通常也被稱之為context域物件
存值:setAttribute(String name, Object object)
取值:getAttribute(String name)

程式碼:
    在InitServlet的Service方法中利用ServletContext物件存入需要共享的資料
    /*獲取ServletContext物件*/  
    ServletContext context = this.getServletContext();   
    //存入共享的資料    
    context.setAttribute("name", "zhangsan"); 

    在其它的Servlet中利用ServletContext物件獲取共享的資料   
    /*獲取ServletContext物件*/  
    ServletContext context = this.getServletContext();   
    //獲取共享的資料   
    String name = context.getAttribute("name");   
    System.out.println("共享的內容值是:"+name);