ServletContext,是一個(gè)全局的儲(chǔ)存信息的空間,服務(wù)器開始,其就存在,服務(wù)器關(guān)閉,其才釋放。request,一個(gè)用戶可有多個(gè);session,一個(gè)用戶一個(gè);而servletContext,所有用戶共用一個(gè)。所以,為了節(jié)省空間,提高效率,ServletContext中,要放必須的、重要的、所有用戶需要共享的線程又是安全的一些信息。
換一種方式說吧,運(yùn)行在Java虛擬機(jī)中的每一個(gè)Web應(yīng)用程序都有一個(gè)與之相關(guān)的Servlet上下文。ServletContext對(duì)象是Web服務(wù)器中的一個(gè)已知路徑的根,Servlet上下文被定位于http://localhost:8080/項(xiàng)目名.以 /項(xiàng)目名 請(qǐng)求路徑(稱為上下文路徑)開始的所有請(qǐng)求被發(fā)送到與此ServletContext關(guān)聯(lián)的Web應(yīng)用程序。一個(gè)ServletContext對(duì)象表示了一個(gè)Web應(yīng)用程序的上下文。
Servlet上下文:Servlet上下文提供對(duì)應(yīng)用程序中所有Servlet所共有的各種資源和功能的訪問。Servlet上下文API用于設(shè)置應(yīng)用程序中所有Servlet共有的信息。Servlet可能需要共享他們之間的共有信息。運(yùn)行于同一服務(wù)器的Servlet有時(shí)會(huì)共享資源,如JSP頁面、文件和其他Servlet。
舉例:
如,做一個(gè)購物類的網(wǎng)站,要從數(shù)據(jù)庫中提取物品信息,如果用session保存這些物品信息,每個(gè)用戶都訪問一便數(shù)據(jù)庫,效率就太低了;所以要用來Servlet上下文來保存,在服務(wù)器開始時(shí),就訪問數(shù)據(jù)庫,將物品信息存入Servlet上下文中,這樣,每個(gè)用戶只用從上下文中讀入物品信息就行了。
3.1 ServletContext接口簡(jiǎn)介
ServletContext接口定義了運(yùn)行servlet的web應(yīng)用的servlet視圖。容器供應(yīng)商負(fù)責(zé)提供servlet容器內(nèi)ServletContext接口的實(shí)現(xiàn)。使用ServletContext對(duì)象,servlet可以記錄事件日志,獲取資源的URL地址,并且設(shè)置和保存上下文內(nèi)可以訪問的其他servlet的屬性。
ServletContext以web的已知路徑為根路徑。比如,假定一個(gè)servlet上下文位于om/catalog。以/catalog請(qǐng)求路徑開頭的所有請(qǐng)求,已知為上下文路徑,被路由到和該ServletContext關(guān)聯(lián)的web應(yīng)用。
3.2 ServletContext接口作用域
容器中部署的每一個(gè)web應(yīng)用都有一個(gè)ServletContext接口的實(shí)例對(duì)象與之關(guān)聯(lián)。如果容器被分布在多個(gè)虛擬機(jī)上,一個(gè)web應(yīng)用將在每一個(gè)VM中有一個(gè)ServletContext實(shí)例。
不作為web應(yīng)用一部分部署的容器中的servlet默認(rèn)是“默認(rèn)”web應(yīng)用的一部分,有一個(gè)默認(rèn)的ServletContext。在分布式容器中。默認(rèn)ServletContext是非分布式的,并且必須只存在于一個(gè)VM中。
3.3 初始化參數(shù)
ServletContext接口的初始化參數(shù)允許servlet訪問與web應(yīng)用相關(guān)的上下文初始化參數(shù),這些由應(yīng)用開發(fā)人員在部署描述符中指定:
getInitParameter
getInitParameterNames
應(yīng)用開發(fā)人員利用初始化參數(shù)傳送配置信息。典型的例子是web管理員的e-mail地址或者一個(gè)持有關(guān)鍵數(shù)據(jù)的系統(tǒng)名稱。
3.4 上下文屬性
servlet可以通過名稱將對(duì)象屬性綁定到上下文。任何綁定到上下文的屬性可以被同一個(gè)web應(yīng)用的其他servlet使用。ServletContext接口的下列方法允許訪問這種功能:
setAttribute
getAttribute
getAttributeNames
removeAttribute
3.4.1 分布式容器中的上下文屬性
上下文屬性對(duì)于創(chuàng)建它們的VM來說是本地的。這防止ServletContext屬性存儲(chǔ)于分布式容器的共享內(nèi)存中。當(dāng)信息需要在運(yùn)行于分布式環(huán)境中的servlet之間共享時(shí),信息被放入會(huì)話中(參見第7章“會(huì)話”),存儲(chǔ)于數(shù)據(jù)庫中,或者存儲(chǔ)于EJB組件中。
3.5 資源
ServletContext接口通過下列方法提供對(duì)web應(yīng)用組成的靜態(tài)內(nèi)容文檔層級(jí)的直接訪問,包括HTML,GIF和JPEG文件:
getResource
getResourceAsStream
getResource和getResourceAsStream方法以“/”開頭的字符串為參數(shù),它指定上下文根路徑的資源相對(duì)路徑。文檔的層級(jí)可能存在于服務(wù)器的文件系統(tǒng),war文件,遠(yuǎn)程服務(wù)器或者在一些其它位置中。
這些方法不用來獲取動(dòng)態(tài)內(nèi)容。比如,在一個(gè)支持JSP規(guī)范1的容器中,getResource("/index.jsp")這種形式的方法調(diào)用將返回JSP源代碼,而不是處理后的輸出。關(guān)于訪問動(dòng)態(tài)內(nèi)容的更多信息參見第8章“轉(zhuǎn)發(fā)請(qǐng)求”。
Web應(yīng)用資源的完整列表可以使用getResourcePaths(String path)方法訪問。該方法語義的完整信息可以在本規(guī)范的API文檔中找到。
3.6 多個(gè)主機(jī)和ServletContext
Web服務(wù)器可能支持一個(gè)服務(wù)器上多個(gè)邏輯主機(jī)共享一個(gè)IP地址。這功能有時(shí)被稱為“虛擬主機(jī)”。這種情況下,每一個(gè)邏輯主機(jī)必須有它自己的servlet上下文或者servlet上下文組。Servlet上下文不可以被多個(gè)虛擬主機(jī)共享。
3.7 重載考慮
盡管容器供應(yīng)商因?yàn)閷?duì)于易于開發(fā)而實(shí)現(xiàn)的類加載不做要求,但是任何那樣的實(shí)現(xiàn)必須確保所有它們可能使用2的所有servlet和類,被加載在單個(gè)類加載器作用域內(nèi)。必須保證應(yīng)用應(yīng)該如開發(fā)人員預(yù)想的那樣運(yùn)轉(zhuǎn)。作為開發(fā)輔助,綁定監(jiān)聽器的會(huì)話通知的完整語義應(yīng)當(dāng)由容器支持,在類加載上會(huì)話終止的監(jiān)聽上使用。
上一代的容器創(chuàng)建新的類加載器以加載servlet,這和用來加載servlet上下文中使用的其他servlet或者類的類加載器不同。這可能造成servlet上下文內(nèi)的對(duì)象引用指向一個(gè)意想不到的類或?qū)ο?,造成意想不到的行為。需要阻止由新一代類加載器所引發(fā)的問題。
3.7.1 臨時(shí)工作目錄
每一個(gè)servlet上下文都需要一個(gè)臨時(shí)存儲(chǔ)目錄。Servlet容器必須為每一個(gè)servlet上下文提供一個(gè)私有的臨時(shí)目錄,并且使它可以通過javax.servlet.context.tempdir上下文屬性可用。這些屬性關(guān)聯(lián)的對(duì)象必須是java.io.File類型。
這項(xiàng)需求認(rèn)可了很多servlet引擎實(shí)現(xiàn)中提供的常見便利。容器不需要在servlet重啟時(shí)維持臨時(shí)目錄的內(nèi)容,但是需要確保一個(gè)servlet上下文的臨時(shí)目錄的內(nèi)容對(duì)于該servlet容器上運(yùn)行的其他web應(yīng)用的servlet上下文不可見。
網(wǎng)頁名稱:ServletContext功能詳解
分享URL:http://www.rwnh.cn/article24/cgjpje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、虛擬主機(jī)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)