ServletContext,是一個全局的儲存信息的空間,服務器開始,其就存在,服務器關閉,其才釋放。request,一個用戶可有多個;session,一個用戶一個;而servletContext,所有用戶共用一個。所以,為了節(jié)省空間,提高效率,ServletContext中,要放必須的、重要的、所有用戶需要共享的線程又是安全的一些信息。
創(chuàng)新互聯(lián)公司服務項目包括東豐網(wǎng)站建設、東豐網(wǎng)站制作、東豐網(wǎng)頁制作以及東豐網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,東豐網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到東豐省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!換一種方式說吧,運行在JAVA虛擬機中的每一個Web應用程序都有一個與之相關的Servlet上下文。ServletContext對象是Web服務器中的一個已知路徑的根,Servlet上下文被定位于http://localhost:8080/項目名.以 /項目名 請求路徑(稱為上下文路徑)開始的所有請求被發(fā)送到與此ServletContext關聯(lián)的Web應用程序。一個ServletContext對象表示了一個Web應用程序的上下文。
Servlet上下文:Servlet上下文提供對應用程序中所有Servlet所共有的各種資源和功能的訪問。Servlet上下文API用于設置應用程序中所有Servlet共有的信息。Servlet可能需要共享他們之間的共有信息。運行于同一服務器的Servlet有時會共享資源,如JSP頁面、文件和其他Servlet。
舉例:
如,做一個購物類的網(wǎng)站,要從數(shù)據(jù)庫中提取物品信息,如果用session保存這些物品信息,每個用戶都訪問一便數(shù)據(jù)庫,效率就太低了;所以要用來Servlet上下文來保存,在服務器開始時,就訪問數(shù)據(jù)庫,將物品信息存入Servlet上下文中,這樣,每個用戶只用從上下文中讀入物品信息就行了。
3.1 ServletContext接口簡介
ServletContext接口定義了運行servlet的web應用的servlet視圖。容器供應商負責提供servlet容器內(nèi)ServletContext接口的實現(xiàn)。使用ServletContext對象,servlet可以記錄事件日志,獲取資源的URL地址,并且設置和保存上下文內(nèi)可以訪問的其他servlet的屬性。
ServletContext以web的已知路徑為根路徑。比如,假定一個servlet上下文位于rp.com/catalog。以/catalog請求路徑開頭的所有請求,已知為上下文路徑,被路由到和該ServletContext關聯(lián)的web應用。
3.2 ServletContext接口作用域
容器中部署的每一個web應用都有一個ServletContext接口的實例對象與之關聯(lián)。如果容器被分布在多個虛擬機上,一個web應用將在每一個VM中有一個ServletContext實例。
不作為web應用一部分部署的容器中的servlet默認是“默認”web應用的一部分,有一個默認的ServletContext。在分布式容器中。默認ServletContext是非分布式的,并且必須只存在于一個VM中。
3.3 初始化參數(shù)
ServletContext接口的初始化參數(shù)允許servlet訪問與web應用相關的上下文初始化參數(shù),這些由應用開發(fā)人員在部署描述符中指定:
getInitParameter
getInitParameterNames
應用開發(fā)人員利用初始化參數(shù)傳送配置信息。典型的例子是web管理員的e-mail地址或者一個持有關鍵數(shù)據(jù)的系統(tǒng)名稱。
3.4 上下文屬性
servlet可以通過名稱將對象屬性綁定到上下文。任何綁定到上下文的屬性可以被同一個web應用的其他servlet使用。ServletContext接口的下列方法允許訪問這種功能:
setAttribute
getAttribute
getAttributeNames
removeAttribute
3.4.1 分布式容器中的上下文屬性
上下文屬性對于創(chuàng)建它們的VM來說是本地的。這防止ServletContext屬性存儲于分布式容器的共享內(nèi)存中。當信息需要在運行于分布式環(huán)境中的servlet之間共享時,信息被放入會話中(參見第7章“會話”),存儲于數(shù)據(jù)庫中,或者存儲于EJB組件中。
3.5 資源
ServletContext接口通過下列方法提供對web應用組成的靜態(tài)內(nèi)容文檔層級的直接訪問,包括HTML,GIF和JPEG文件:
getResource
getResourceAsStream
getResource和getResourceAsStream方法以“/”開頭的字符串為參數(shù),它指定上下文根路徑的資源相對路徑。文檔的層級可能存在于服務器的文件系統(tǒng),war文件,遠程服務器或者在一些其它位置中。
這些方法不用來獲取動態(tài)內(nèi)容。比如,在一個支持JSP規(guī)范1的容器中,getResource("/index.jsp")這種形式的方法調(diào)用將返回JSP源代碼,而不是處理后的輸出。關于訪問動態(tài)內(nèi)容的更多信息參見第8章“轉(zhuǎn)發(fā)請求”。
Web應用資源的完整列表可以使用getResourcePaths(String path)方法訪問。該方法語義的完整信息可以在本規(guī)范的API文檔中找到。
3.6 多個主機和ServletContext
Web服務器可能支持一個服務器上多個邏輯主機共享一個IP地址。這功能有時被稱為“虛擬主機”。這種情況下,每一個邏輯主機必須有它自己的servlet上下文或者servlet上下文組。Servlet上下文不可以被多個虛擬主機共享。
3.7 重載考慮
盡管容器供應商因為對于易于開發(fā)而實現(xiàn)的類加載不做要求,但是任何那樣的實現(xiàn)必須確保所有它們可能使用2的所有servlet和類,被加載在單個類加載器作用域內(nèi)。必須保證應用應該如開發(fā)人員預想的那樣運轉(zhuǎn)。作為開發(fā)輔助,綁定監(jiān)聽器的會話通知的完整語義應當由容器支持,在類加載上會話終止的監(jiān)聽上使用。
上一代的容器創(chuàng)建新的類加載器以加載servlet,這和用來加載servlet上下文中使用的其他servlet或者類的類加載器不同。這可能造成servlet上下文內(nèi)的對象引用指向一個意想不到的類或?qū)ο?,造成意想不到的行為。需要阻止由新一代類加載器所引發(fā)的問題。
3.7.1 臨時工作目錄
每一個servlet上下文都需要一個臨時存儲目錄。Servlet容器必須為每一個servlet上下文提供一個私有的臨時目錄,并且使它可以通過javax.servlet.context.tempdir上下文屬性可用。這些屬性關聯(lián)的對象必須是java.io.File類型。
這項需求認可了很多servlet引擎實現(xiàn)中提供的常見便利。容器不需要在servlet重啟時維持臨時目錄的內(nèi)容,但是需要確保一個servlet上下文的臨時目錄的內(nèi)容對于該servlet容器上運行的其他web應用的servlet上下文不可見。