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