[07] ServletContext上下文對象



1、上下文的概念

我們在說到Servlet的繼承關系時,提到自定義Servlet實際上間接實現了Servlet和ServletConfig兩個接口,其中ServletConfig接口中定義了一個方法叫getServletContext,用以獲取Servlet運行的上下文環境對象。

這里就要先說明一下,如何理解所謂的 “上下文”。

每個Web項目,運行時部署在Web應用服務器(如Tomcat、Jetty、WebLogic etc.)下,我們稱之為一個應用(Application)。我們知道一個Web應用里可以有多個Servlet,而這里的Servlet上下文就可以理解為這些Servlet的運行環境。

抽象地說,是Web服務器中已知路徑的根,是一個域,一個環境范圍:

形象地說,如果把數據比作魚,Servlet比作鴨子,那么所謂的Servlet上下文就是湖水或者湖:

如果現在有一份數據需要傳給所有的Servlet使用,那么我們就可以使用ServletContext對象了。就像某只鴨子(Servlet)肚子里的魚(數據)是沒辦法共享給另一只鴨子的,可是放在湖里的魚,至少每個鴨子都可以去咀一口,這里的湖就是ServletContext了。
 

2、ServletContext對象的獲取

其實從上面我們對ServletContext的描述,也不難推斷出它的創建時機:每當一個Web應用被加載,那么它的上下文環境就被封裝為一個ServletContext對象創建出來了。

如何得到ServletContext對象?

實際上,ServletContext對象被放到了每一個Servlet中的ServletConfig對象里,還記得繼承關系中GenericServlet的init方法嗎:

public void init(ServletConfig config) throws ServletException { 
    this.config = config;
    this.init();
}

初始化時,就把裝有ServletContext的ServletConfig,在init方法中賦值給了屬性config。而GenericServlet有一個getServletContext方法,它先調用自身的getServletConfig,再調用ServletConfig對象的getServletContext的方法:

public ServletContext getServletContext() {
    return getServletConfig().getServletContext();
}

也就是說,我們自定義的Servlet由於繼承關系,可以 直接調用getServletContext方法,獲取上下文對象

ServletContext servletContext = this.getServletContext();

3、ServletContext的方法

Servlet API 中定義了ServletContext接口,用來封裝上下文對象。

下面是部分方法:
類型         方法名        
說明    
void     setAttribute(String key, Object value) 以key/value形式保存對象值
Object     getAttribute(String key) 通過key獲取對象值
String     getInitParameter(String path) 返回上下文參數的值    
String     getRealPath(String path) 根據虛擬路徑返回實際路徑

  • getAttribute / setAttribute 通過理解我們知道,ServletContext類似一個全局變量,可以使用者兩個方法實現多個用戶之間數據共享
  • getInitParameter 單個Servlet可以在web.xml中配置初始參數,上下文環境當然也可以
    • <context-param> <param-name>name<param-name/> <param-value>value<param-value/> </context-param>
  • getRealPath 獲取Web應用根目錄實際路徑,如getRealPath("/")返回諸如類似於C:\workspace\project\train\test\learn\src\main\webapp\



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM