[07] ServletContext上下文對象
阿新 • • 發佈:2017-09-01
-name image gets left urn spa pro relative pac
這裏就要先說明一下,如何理解所謂的 “上下文”。
每個Web項目,運行時部署在Web應用服務器(如Tomcat、Jetty、WebLogic etc.)下,我們稱之為一個應用(Application)。我們知道一個Web應用裏可以有多個Servlet,而這裏的Servlet上下文就可以理解為這些Servlet的運行環境。
抽象地說,是Web服務器中已知路徑的根,是一個域,一個環境範圍:
形象地說,如果把數據比作魚,Servlet比作鴨子,那麽所謂的Servlet上下文就是湖水或者湖:
如果現在有一份數據需要傳給所有的Servlet使用,那麽我們就可以使用ServletContext對象了。就像某只鴨子(Servlet)肚子裏的魚(數據)是沒辦法共享給另一只鴨子的,可是放在湖裏的魚,至少每個鴨子都可以去咀一口,這裏的湖就是ServletContext了。
如何得到ServletContext對象?
實際上,ServletContext對象被放到了每一個Servlet中的ServletConfig對象裏,還記得繼承關系中GenericServlet的init方法嗎:
初始化時,就把裝有ServletContext的ServletConfig,在init方法中賦值給了屬性config。而GenericServlet有一個getServletContext方法,它先調用自身的getServletConfig,再調用ServletConfig對象的getServletContext的方法:
也就是說,我們自定義的Servlet由於繼承關系,可以直接調用getServletContext方法,獲取上下文對象:
下面是部分方法:
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\
[07] ServletContext上下文對象