1. 程式人生 > >ServletContext 與application的異同

ServletContext 與application的異同

servletContext介面是Servlet中最大的一個介面,呈現了web應用的Servlet檢視。ServletContext例項是通過 getServletContext()方法獲得的,由於HttpServlet繼承Servlet的關係GenericServlet類和HttpServlet類同時具有該方法。

條件:假設說我們有一個WEB應用,這個WEB應用中有10SERVLET 

在這裡,這個WEB應用就擁有一個它自己的倉庫-ServletContext,而這10Servlet則共享這個大倉庫,並且各自擁有屬於他們自己的小倉庫-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.
呼叫servletinit()方法初始化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的異同

相同:其實servletContextapplication 是一樣的,就相當於一個類建立了兩個不同名稱的變數。在

      servletServletContext就是application物件。大家只要開啟jsp編譯過後生成的Servlet中的

      _jspService()方法就可以看到如下的宣告:
            ServletContextapplication = null;

            application= pageContext.getServletContext(); 

不同:兩者的區別就是application用在jsp中,servletContext用在servlet中。applicationpage  

      requestsession 都是JSP中的內建物件,在後臺用ServletContext儲存的屬性資料可以用

      application物件獲得。

而且application的作用域是整個Tomcat啟動的過程。例如:ServletContext.setAttribute("username",username);
則在JSP網頁中可以使用  application.getAttribute("username");
來得到這個使用者名稱。