今天突然想研究下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來做一些清理。