servlet 、GenericServlet 、HttpServlet 詳解

今天突然想研究下servlet,總結下新的,希望對大家有幫助:

 

 

首先,看看怎樣才能實現一個servlet,方法有3種:

1、實現servlet接口

2、繼承GenericServlet(實現service 方法

3、繼承HttpServlet類(重寫doGet,doPost方法就行)

 

servlet 接口源代碼

 

GenericServlet源代碼

 

 

HttpServlet源代碼

 

 

 

GenericServlet實現了接口:Servlet , ServletConfig

HttpServlet :繼承了GenericServlet 

 

 

咱先看下訪問頁面是怎樣的一個流程:

 

當你訪問一個servlet的時候(也可以說是訪問一個jsp頁面),訪問的方式有(get,post,delete),調用service()方法處理你的請求,你可以在裏面寫你想要幹嘛。

 

在GenericServlet中,service是一個抽象方法,也就是當你以繼承GenericServlet的方式創建一個servlet時,必須實現service方法,在裏面處理前端發過來的request,和response。

 

在HttpServlet中,大家可以看它的原代碼,有2個service方法,一個是保護的(主要看裏面的實現),一個是公有的,公有的service接收到請求時,會拋給保護的那個service,它在這只是起一箇中轉的作用。當前端有請求過來時,會默認找到這2個service方法,具體先找哪個我不清楚,反正最後請求都會在保護的那個service那裏,在那個service中,會根據前端是哪種方式的請求,再拋給相應的處理方法,如:get則交給doGet處理。所以,在以繼承GenericServlet的方式創建一個servlet時,你只要重寫相應的doGet或者doPost等處理方法就行了,然後再在裏面寫你的代碼就行了。

 

 

--------------------

還有一個就是關於servlet的生命週期,它開始於init,而且容器中一個servlet只有一個實例,多個請求過來時,是共享一個servlet的,每次請求都是調用service,它銷燬與容器關閉的時候,還有人說可以調用destory來銷燬一個實例,我做了實驗,不行。可能是不同容器不同的處理吧,你們可以看下源代碼,destory在GenericServlet中是空實現,不知道爲什麼。求高手解答。

 

 

測試銷燬servlet的代碼

 

 

 

 

其實,當你reload一些服務器或者關閉服務器或者重啓服務器時,纔會調用destory,這個方法有點像垃圾回收裏面那個finalize(),在執行Gc前,會調用finalize來做一些清理。

 

 

 

 

 

 

 

 

 

 

發佈了56 篇原創文章 · 獲贊 8 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章