[Java] Servlet

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");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,373評論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 簡書 賈小強轉(zhuǎn)載請注明原創(chuàng)出處,謝謝! Servlet是一種允許響應(yīng)請求的Java類。雖然Servlet可以響應(yīng)任...
    賈小強閱讀 10,643評論 1 44
  • Servlet編程需要使用到j(luò)avax.servlet 和 javax.servlet.http兩個包下面的類和...
    誰吃了我的薯條閱讀 348評論 0 0
  • 1 如何開發(fā)一個Servlet(重點) 1.1 步驟: 1)編寫java類,繼承HttpServlet類 2)重新...
    yangliangliang閱讀 369評論 0 0