1. 程式人生 > >[07] ServletContext上下文對象

[07] ServletContext上下文對象

-name image gets left urn spa pro relative pac


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方法嗎:
  1. public void init(ServletConfig config) throws ServletException {
  2. this.config = config;
  3. this.init();
  4. }

初始化時,就把裝有ServletContext的ServletConfig,在init方法中賦值給了屬性config。而GenericServlet有一個getServletContext方法,它先調用自身的getServletConfig,再調用ServletConfig對象的getServletContext的方法:
  1. public
    ServletContext getServletContext() {
  2. return getServletConfig().getServletContext();
  3. }

也就是說,我們自定義的Servlet由於繼承關系,可以直接調用getServletContext方法,獲取上下文對象
  1. 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\


[07] ServletContext上下文對象