1. 程式人生 > >ServletContext作用功能詳解

ServletContext作用功能詳解

tle 記錄 人員 target 列表 頁面 catalog 程序 iyu

本文轉自http://blog.csdn.net/lvzhiyuan/article/details/4664624 感謝作者

ServletContext,是一個全局的儲存信息的空間,服務器開始,其就存在,服務器關閉,其才釋放。request,一個用戶可有多個;session,一個用戶一個;而servletContext,所有用戶共用一個。所以,為了節省空間,提高效率,ServletContext中,要放必須的、重要的、所有用戶需要共享的線程又是安全的一些信息。

換一種方式說吧,運行在Java虛擬機中的每一個Web應用程序都有一個與之相關的Servlet上下文。ServletContext對象是Web服務器中的一個已知路徑的根,Servlet上下文被定位於

http://localhost:8080/項目名.以 /項目名 請求路徑(稱為上下文路徑)開始的所有請求被發送到與此ServletContext關聯的Web應用程序。一個ServletContext對象表示了一個Web應用程序的上下文。

Servlet上下文:Servlet上下文提供對應用程序中所有Servlet所共有的各種資源和功能的訪問。Servlet上下文API用於設置應用程序中所有Servlet共有的信息。Servlet可能需要共享他們之間的共有信息。運行於同一服務器的Servlet有時會共享資源,如JSP頁面、文件和其他Servlet。

舉例:

如,做一個購物類的網站,要從數據庫中提取物品信息,如果用session保存這些物品信息,每個用戶都訪問一便數據庫,效率就太低了;所以要用來Servlet上下文來保存,在服務器開始時,就訪問數據庫,將物品信息存入Servlet上下文中,這樣,每個用戶只用從上下文中讀入物品信息就行了。

3.1 ServletContext接口簡介

ServletContext接口定義了運行servlet的web應用的servlet視圖。容器供應商負責提供servlet容器內ServletContext接口的實現。使用ServletContext對象,servlet可以記錄事件日誌,獲取資源的URL地址,並且設置和保存上下文內可以訪問的其他servlet的屬性。

ServletContext以web的已知路徑為根路徑。比如,假定一個servlet上下文位於http://www.mycorp.com/catalog。以/catalog請求路徑開頭的所有請求,已知為上下文路徑,被路由到和該ServletContext關聯的web應用。

3.2 ServletContext接口作用域

容器中部署的每一個web應用都有一個ServletContext接口的實例對象與之關聯。如果容器被分布在多個虛擬機上,一個web應用將在每一個VM中有一個ServletContext實例。

不作為web應用一部分部署的容器中的servlet默認是“默認”web應用的一部分,有一個默認的ServletContext。在分布式容器中。默認ServletContext是非分布式的,並且必須只存在於一個VM中。

3.3 初始化參數

ServletContext接口的初始化參數允許servlet訪問與web應用相關的上下文初始化參數,這些由應用開發人員在部署描述符中指定:

getInitParameter

getInitParameterNames

應用開發人員利用初始化參數傳送配置信息。典型的例子是web管理員的e-mail地址或者一個持有關鍵數據的系統名稱。

3.4 上下文屬性

servlet可以通過名稱將對象屬性綁定到上下文。任何綁定到上下文的屬性可以被同一個web應用的其他servlet使用。ServletContext接口的下列方法允許訪問這種功能:

setAttribute

getAttribute

getAttributeNames

removeAttribute

3.4.1 分布式容器中的上下文屬性

上下文屬性對於創建它們的VM來說是本地的。這防止ServletContext屬性存儲於分布式容器的共享內存中。當信息需要在運行於分布式環境中的servlet之間共享時,信息被放入會話中(參見第7章“會話”),存儲於數據庫中,或者存儲於EJB組件中。

3.5 資源

ServletContext接口通過下列方法提供對web應用組成的靜態內容文檔層級的直接訪問,包括HTML,GIF和JPEG文件:

getResource

getResourceAsStream

getResource和getResourceAsStream方法以“/”開頭的字符串為參數,它指定上下文根路徑的資源相對路徑。文檔的層級可能存在於服務器的文件系統,war文件,遠程服務器或者在一些其它位置中。

這些方法不用來獲取動態內容。比如,在一個支持JSP規範1的容器中,getResource("/index.jsp")這種形式的方法調用將返回JSP源代碼,而不是處理後的輸出。關於訪問動態內容的更多信息參見第8章“轉發請求”。

Web應用資源的完整列表可以使用getResourcePaths(String path)方法訪問。該方法語義的完整信息可以在本規範的API文檔中找到。

3.6 多個主機和ServletContext

Web服務器可能支持一個服務器上多個邏輯主機共享一個IP地址。這功能有時被稱為“虛擬主機”。這種情況下,每一個邏輯主機必須有它自己的servlet上下文或者servlet上下文組。Servlet上下文不可以被多個虛擬主機共享。

3.7 重載考慮

盡管容器供應商因為對於易於開發而實現的類加載不做要求,但是任何那樣的實現必須確保所有它們可能使用2的所有servlet和類,被加載在單個類加載器作用域內。必須保證應用應該如開發人員預想的那樣運轉。作為開發輔助,綁定監聽器的會話通知的完整語義應當由容器支持,在類加載上會話終止的監聽上使用。

上一代的容器創建新的類加載器以加載servlet,這和用來加載servlet上下文中使用的其他servlet或者類的類加載器不同。這可能造成servlet上下文內的對象引用指向一個意想不到的類或對象,造成意想不到的行為。需要阻止由新一代類加載器所引發的問題。

3.7.1 臨時工作目錄

每一個servlet上下文都需要一個臨時存儲目錄。Servlet容器必須為每一個servlet上下文提供一個私有的臨時目錄,並且使它可以通過javax.servlet.context.tempdir上下文屬性可用。這些屬性關聯的對象必須是java.io.File類型。

這項需求認可了很多servlet引擎實現中提供的常見便利。容器不需要在servlet重啟時維持臨時目錄的內容,但是需要確保一個servlet上下文的臨時目錄的內容對於該servlet容器上運行的其他web應用的servlet上下文不可見。

ServletContext作用功能詳解