ServletContext接口定義了一個web應用程序的servlet視圖,這些servlet就運行在此web應用程序中。Container的提供者負責提供container中ServletContext接口的實現。使用ServletContext對象,servlet能夠記錄時間,取得資源的引用URL,設置並存儲context中其它servlet也能夠可訪問的attribute(set and store attributes that other servlets in the context can access)。html
ServletContext被root於web server中一個已知的路徑。例如:一個servlet context能夠被配置在http://www.google.com/catalog。做爲context path,以request路徑/catalog開始的全部請求,都會發送至與此ServletContext相關聯的web application。java
每一個發佈到container中的web application都有一個ServletContext的實例與之相關聯。若是container是分佈式的運行在多臺虛擬機上,那麼web application將在每個JVM上有一個ServletContext的實例。
在container中,沒有做爲web application的一部分被部署的servlet,是「默認」web application隱含的一部分,而且有一個默認的ServletContext。在分佈式container中,默認的ServletContext並非分佈式的,而是隻存在於一個JVM中。web
下面的ServletContext接口的方法容許servlet訪問存取與web application相關聯的context初始化參數,這些參數由應用程序開發者在部署描述符中描述。數據庫
getInitParameter服務器
getInitParameterNamessession
初始化參數被開發者用來傳達配置信息。典型的狀況是站點管理員的的email地址,或者持有關鍵資源的系統的名稱(the name of a system that holds critical data)。app
Servlet能夠經過名稱將一個對象做爲屬性綁定到context。全部與context綁定的屬性都對於同一個web application中其餘任何的servlet都是有效的。如下是ServletContext接口中支持這種功能的方法:jsp
setAttribute分佈式
getAtrributeide
getAtrributeNames
removeAttribute
Context的attribute只在對於context所在的JVM中有效。這防止了ServletContext的attribute在分佈式container中成爲共享的內存數據。當有信息須要在運行在分佈式環境下的不一樣servlet之間共享時,這些信息應該被放到session中(參見SRV.7 Sessions),存在數據庫中,或者set到一個EJB組件中。
ServletContext接口只對web application中靜態內容文檔的層次結構提供了直接的存取的功能。,包括html,gif和jpeg文件,經過ServletContext接口的如下方法:
getResource
getResourceAsStream
getResource和getResourceAsStream方法以一個以「/」開頭的字符串做爲參數,這個參數表明了資源相對於context的路徑。這個文檔的曾其結構可能會出如今server的文件系統裏,web application存檔文件裏,或者一個遠程服務器,甚至一些其餘的位置。
這些方法不是用來獲取動態內容的。例如,在支持JSP規範的container中,一個形式爲getResource("/index.jsp")的方法調用會返回這個 jsp的源代碼,而不是jsp執行後的輸出結果。參見SRV.8 Dispatching Request,以獲取關於存取動態內容的更多信息。
Web application中全部資源的列表能夠經過使用getResourcePath(String path)方法得到。此方法的語法細則能夠在servlet的API中找到。
Web server能夠支持在一臺服務器上多邏輯主機共享一個 IP地址,這種能力有時被稱爲「虛擬主機」。在這種狀況下,每一個邏輯主機必須有它本身的servlet context或者servlet context 的集合。servlet context不能被多個虛擬主機共享。
雖然container提供者不是必須爲了方便開發者而實現class reloading的方案,任何這樣的實現都必須明確,全部它們可能使用的servlet和class(An exception is system classes that the servlet may use in a different class loader),都只裝載在單個class loader中,這樣才能保證應用程序呈現出開發者所指望的行爲。爲了方便開發者,container應該提供完整的session綁定listener的通知,以便用來監控在class reloading以前的session終止(session termination upon class reloading)。
上一代的container建立新的class loader來裝載servlet,不一樣於被用來裝載servlet context中其餘servlet或者class的class loader(distinct from class loaders used to load other servlets or classes used in the servlet context)。
每一個servlet context都須要一個臨時存儲目錄。Servlet container必須爲每一個servlet context提供一個私有的臨時目錄,而且經過javax.servlet.context.tempdir這個context attribute來使其可用。與這個attribute相關聯的對象必須使java.io.File類型。 這一點被公認爲是習慣作法,不少servlet引擎都提供了這樣的實現。當container重啓時,並不被要求去保持這個臨時目錄下的內容,可是必須保證臨時目錄中的一個servlet context的內容對與container中其餘web application的servlet context使不可見的。