1. 什么是Servlet
Servlet是Sun公司提供的一門用于開發(fā)動態(tài)Web資源的技術(shù)。
Sun公司在其API中提供了一個Servlet接口,用戶如果想開發(fā)一個動態(tài)Web資源,
需要完成以下2個步驟:
(1)編寫一個Java類,實現(xiàn)Servlet接口。
(2)把開發(fā)好的Java類部署到Web服務(wù)器中。
通常我們也把實現(xiàn)了Servlet接口的Java程序,也稱之為Servlet。
2. Web服務(wù)器處理請求的過程
Servlet程序由Web服務(wù)器調(diào)用,Web服務(wù)器收到客戶端對Servlet的訪問請求后:
(1)Web服務(wù)器首先檢查是否已創(chuàng)建并裝載了該Servlet的實例對象,是(4)否(2)
(2)創(chuàng)建并裝載該Servlet的一個實例對象
(3)調(diào)用Servlet實例對象的init()方法
(4)創(chuàng)建一個用于封裝HTTP請求消息的HttpServletRequest對象,和一個代表HTTP響應(yīng)的HttpServletResponse對象。然后調(diào)用Servlet的service()方法并將請求和響應(yīng)對象作為參數(shù)傳遞進去。
(5)Web應(yīng)用程序被停止或重新啟動之前,Servlet引擎將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法
3. HttpServlet的doGet與doPost方法
Servlet接口Sun公司定義了2個默認實現(xiàn)類,分別為:GenericServlet,HttpServlet
開發(fā)人員在編寫Servlet時,通常應(yīng)繼承這個類,而避免直接去實現(xiàn)Servlet接口。
HttpServlet在實現(xiàn)Servlet接口時,覆寫了service方法,該方法體內(nèi)的代碼會自動判斷用戶的請求方式,如為GET請求,則調(diào)用HttpServlet的doGet方法,如為Post請求,則調(diào)用doPost方法。
因此,開發(fā)人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。
4. 多次請求共用一個Servlet實例
Servlet是一個供其他Java程序(Servlet引擎)調(diào)用的Java類,它不能獨立運行,它的運行完全由Servlet引擎來控制和調(diào)度。
針對客戶端的多次Servlet請求,通常情況下,服務(wù)器只會創(chuàng)建一個Servlet實例對象,也就是說Servlet實例對象一旦創(chuàng)建,它就會駐留在內(nèi)存中,為后續(xù)的其它請求服務(wù),直至web容器退出,servlet實例對象才會銷毀。
在Servlet的整個生命周期內(nèi),Servlet的init方法只被調(diào)用一次。
而對一個Servlet的每次訪問請求都導(dǎo)致Servlet引擎調(diào)用一次servlet的service方法。
對于每次訪問請求,Servlet引擎都會創(chuàng)建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應(yīng)對象,然后將這兩個對象作為參數(shù)傳遞給它調(diào)用的Servlet的service()方法,service方法再根據(jù)請求方式分別調(diào)用doXXX方法。
5. 線程安全性
當多個客戶端并發(fā)訪問同一個Servlet時,web服務(wù)器會為每一個客戶端的訪問請求創(chuàng)建一個線程,并在這個線程上調(diào)用Servlet的service方法,因此service方法內(nèi)如果訪問了同一個資源的話,就有可能引發(fā)線程安全問題。
針對Servlet的線程安全問題,Sun公司是提供有解決方案的:
讓Servlet去實現(xiàn)一個SingleThreadModel接口。
對于實現(xiàn)了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對該Servlet的多線程并發(fā)訪問,其采用的方式是產(chǎn)生多個Servlet實例對象,并發(fā)的每個線程分別調(diào)用一個獨立的Servlet實例對象。
6. ServletContext對象
WEB容器在啟動時,它會為每個WEB應(yīng)用程序都創(chuàng)建一個對應(yīng)的ServletContext對象,它代表當前web應(yīng)用。開發(fā)人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
由于一個WEB應(yīng)用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現(xiàn)通訊。
ServletContext對象通常也被稱之為context域?qū)ο蟆?/p>
servlet1:
ServletContext context = this.getServletConfig().getServletContext();
context.setAttribute("data", data);
servlet2:
ServletContext context = this.getServletContext();
tring data = (String) context.getAttribute("data");