servletContext接口是Servlet中最大的一個接口,呈現(xiàn)了web應(yīng)用的Servlet視圖。ServletContext實(shí)例是通過getServletContext()方法獲得的,由于HttpServlet繼承Servlet的關(guān)系GenericServlet類和HttpServlet類同時具有該方法。
條件:假設(shè)說我們有一個WEB應(yīng)用,這個WEB應(yīng)用中有10個SERVLET 在這里,這個WEB應(yīng)用就擁有一個它自己的倉庫-ServletContext,而這10個Servlet則共享這個大倉庫,并且各自擁有屬于他們自己的小倉庫-ServletConfig。 ServletContext就是一個全局的概念,它屬于應(yīng)用,但我們有時候不想讓某些參數(shù)被其他Servlet應(yīng)用,僅僅想在自己的Servlet中被共享,這時候就需要把它保存在ServletConfig中,換句話說,從【一個Servlet】來看,ServletConfig是它的全局,而從一個【Servlet集合(Web應(yīng)用)】來看,ServletContext是它的全局。 個人觀點(diǎn),僅供參考。
是這樣的,假設(shè)現(xiàn)在要運(yùn)行一個應(yīng)用。 1.Tomcat啟動→讀入xml文件 2.容器為這個應(yīng)用建立一個新的ServletContext實(shí)例,應(yīng)用的所有部分都共享這個上下文 3.如果xml中有定義上下文的初始參數(shù),則容器首先創(chuàng)建初始參數(shù)實(shí)例(應(yīng)該就像一個Bean一樣) 4.把初始化參數(shù)實(shí)例的引用交給ServletContext 5.容器建立一個新的servlet,這時建立一個新的ServletConfig對象,并且為這個ServletConfig對象提供一個ServletContext的引用 6.調(diào)用servlet的init()方法初始化servlet 由第5步可以看出,每個servlet中都有一個上下文(ServletContext)的引用,因此,servlet都知道這個上下文。 但是ServletContext的實(shí)例比Servlet先誕生,所以ServletContext誕生的時候并不知道Servlet的存在。 在java EE API文檔中 ServlectContext擁有獲得Servlet的方法 例如:Servlet getServlet(String name) 但是,這一類的方法已經(jīng)廢棄了,從注釋中可以看出,原先的這些方法返回的值是null,也就是無法獲得servlet 因此,ServlectContext誕生的時候并不知道Servlet的存在,它的誕生僅僅是因?yàn)槿萜髡Q生了~~ 我個人感覺,ServletContext中并沒有Servlet的信息,相反,每個Servlet中都持有ServletContext的引用。
在HeadFirstjsp中有一個說法我覺得不錯,ServletContext就像一塊布告欄,你可以往上貼布告,走過的人都可以看到它!
servlet上下文,是針對servletconfig而提出來的,因?yàn)槿萜髟谂渲梦募刑崛〉某跏蓟瘏?shù)保存在了servletconfig對象中,但由于初始化參數(shù)只針對某個具體的servlet而言,別的servlet是訪問不到這個參數(shù)的,所以為了提供一個可以供全體servlet使用的對象--這個對象也可以從配置文件中獲取參數(shù),哪個老外就弄出了一個servletcontext對象,并把它稱為上下文或者應(yīng)用上下文,其實(shí)就這么簡單。只不過大家現(xiàn)在所聽到的所看到的上下文被形態(tài)化了,經(jīng)典話了而已。追起本質(zhì),還是很好理解的。
ServletContext 與application的異同
相同:其實(shí)servletContext和application 是一樣的,就相當(dāng)于一個類創(chuàng)建了兩個不同名稱的變量。在
servlet中ServletContext就是application對象。大家只要打開jsp編譯過后生成的Servlet中的
_jspService()方法就可以看到如下的聲明: ServletContextapplication = null;
application= pageContext.getServletContext();
不同:兩者的區(qū)別就是application用在jsp中,servletContext用在servlet中。application和page
requestsession 都是JSP中的內(nèi)置對象,在后臺用ServletContext存儲的屬性數(shù)據(jù)可以用
application對象獲得。
而且application的作用域是整個Tomcat啟動的過程。例如:ServletContext.setAttribute("username",username);則在JSP網(wǎng)頁中可以使用 application.getAttribute("username");
來得到這個用戶名。
轉(zhuǎn)載自
http://tianxingzhe.blog.51cto.com/3390077/1659348/