servletContext接口是Servlet中最大的一個(gè)接口,呈現(xiàn)了web應(yīng)用的Servlet視圖傀蓉。ServletContext實(shí)例是通過(guò) getServletContext()方法獲得的欧漱,由于HttpServlet繼承Servlet的關(guān)系GenericServlet類(lèi)和HttpServlet類(lèi)同時(shí)具有該方法。
條件:假設(shè)說(shuō)我們有一個(gè)WEB應(yīng)用葬燎,這個(gè)WEB應(yīng)用中有10個(gè)SERVLET
在這里误甚,這個(gè)WEB應(yīng)用就擁有一個(gè)它自己的倉(cāng)庫(kù)-ServletContext,而這10個(gè)Servlet則共享這個(gè)大倉(cāng)庫(kù)谱净,并且各自擁有屬于他們自己的小倉(cāng)庫(kù)-ServletConfig窑邦。
ServletContext就是一個(gè)全局的概念,它屬于應(yīng)用壕探,但我們有時(shí)候不想讓某些參數(shù)被其他Servlet應(yīng)用冈钦,僅僅想在自己的Servlet中被共享,這時(shí)候就需要把它保存在ServletConfig中李请,換句話(huà)說(shuō)瞧筛,從一個(gè)Servlet來(lái)看厉熟,ServletConfig是它的全局,而從一個(gè)Servlet集合(Web應(yīng)用)來(lái)看较幌,ServletContext是它的全局揍瑟。
假設(shè)現(xiàn)在要運(yùn)行一個(gè)應(yīng)用。
1.Tomcat啟動(dòng)→讀入xml文件
2.容器為這個(gè)應(yīng)用建立一個(gè)新的ServletContext實(shí)例乍炉,應(yīng)用的所有部分都共享這個(gè)上下文
3.如果xml中有定義上下文的初始參數(shù)绢片,則容器首先創(chuàng)建初始參數(shù)實(shí)例(應(yīng)該就像一個(gè)Bean一樣)
4.把初始化參數(shù)實(shí)例的引用交給ServletContext
5.容器建立一個(gè)新的servlet,這時(shí)建立一個(gè)新的ServletConfig對(duì)象岛琼,并且為這個(gè)ServletConfig對(duì)象提供一個(gè)ServletContext的引用
6.調(diào)用servlet的init()方法初始化servlet
由第5步可以看出底循,每個(gè)servlet中都有一個(gè)上下文(ServletContext)的引用,因此衷恭,servlet都知道這個(gè)上下文此叠。
但是ServletContext的實(shí)例比Servlet先誕生,所以ServletContext誕生的時(shí)候并不知道Servlet的存在随珠。
在JAVA EE API文檔中
ServlectContext擁有獲得Servlet的方法
例如:Servlet getServlet(String name)
但是,這一類(lèi)的方法已經(jīng)廢棄了猬错,從注釋中可以看出窗看,原先的這些方法返回的值是null,也就是無(wú)法獲得servlet
因此倦炒,ServlectContext誕生的時(shí)候并不知道Servlet的存在显沈,它的誕生僅僅是因?yàn)槿萜髡Q生了
筆者覺(jué)得,ServletContext中并沒(méi)有Servlet的信息逢唤,相反拉讯,每個(gè)Servlet中都持有ServletContext的引用。
在HeadFirstJSP中有一個(gè)說(shuō)法我覺(jué)得不錯(cuò)鳖藕,ServletContext就像一塊布告欄魔慷,你可以往上貼布告,走過(guò)的人都可以看到它著恩!
servlet上下文院尔,是針對(duì)servletconfig而提出來(lái)的,因?yàn)槿萜髟谂渲梦募刑崛〉某跏蓟瘏?shù)保存在了servletconfig對(duì)象中喉誊,但由于初始化參數(shù)只針對(duì)某個(gè)具體的servlet而言邀摆,別的servlet是訪(fǎng)問(wèn)不到這個(gè)參數(shù)的,所以為了提供一個(gè)可以供全體servlet使用的對(duì)象--這個(gè)對(duì)象也可以從配置文件中獲取參數(shù)伍茄,哪個(gè)老外就弄出了一個(gè)servletcontext對(duì)象栋盹,并把它稱(chēng)為上下文或者應(yīng)用上下文,其實(shí)就這么簡(jiǎn)單敷矫。只不過(guò)大家現(xiàn)在所聽(tīng)到的所看到的上下文被形態(tài)化了例获,經(jīng)典話(huà)了而已音念。追起本質(zhì),還是很好理解的躏敢。
ServletContext 與application的異同
相同:其實(shí)servletContext和application 是一樣的闷愤,就相當(dāng)于一個(gè)類(lèi)創(chuàng)建了兩個(gè)不同名稱(chēng)的變量。在servlet中ServletContext就是application對(duì)象件余。大家只要打開(kāi)jsp編譯過(guò)后生成的Servlet中的
_jspService()方法就可以看到如下的聲明:
ServletContextapplication = null;
application= pageContext.getServletContext();
不同:兩者的區(qū)別就是application用在jsp中讥脐,servletContext用在servlet中。application和page
requestsession 都是JSP中的內(nèi)置對(duì)象啼器,在后臺(tái)用ServletContext存儲(chǔ)的屬性數(shù)據(jù)可以用
application對(duì)象獲得旬渠。
而且application的作用域是整個(gè)Tomcat啟動(dòng)的過(guò)程。
例如:ServletContext.setAttribute("username",username);
則在JSP網(wǎng)頁(yè)中可以使用? application.getAttribute("username");
來(lái)得到這個(gè)用戶(hù)名端壳。