1:加載Servlet
web容器負責加載Servlet,當web容器啟動時或者是在第一次使用這個Servlet時,容器會負責創建Servlet實例,但是用戶必須通過部署描述符(web.xml)指定Servlet的位置,也就是Servlet所在的類名稱,成功加載后,web容器會通過反射的方式對Servlet進行實例化。
2:初始化
當一個Servlet初始化后,容器將調用init()方法初始化這個對象,初始化的目的是為了讓Servlet在處理客戶端請求前完成一些初始化的工作,如建立數據庫連接,讀取資源文件信息等,如果初始化失敗,則次Servlet將被直接卸載。
3:進入服務
當有請求提交時,Servlet將調用service()方法進行處理,常用的是service根據請求類型調用doGet()或者doPost()方法進行處理;在service()方法中,Servlet可以通過ServletRequest接受客戶的請求,也可以利用ServletResponse設置響應信息。
4:銷毀
當web容器關閉或者檢測到一個Servlet要從容器中被刪除時,會自動調用destroy()方法,以便讓該實例釋放掉所占用的資源。
5:卸載
當一個Servlet調用完destroy()方法后,次實例將等待被垃圾收集器所回收,如果需要再次使用此Servlet時,會重新調用init()方法初始化。
注意:
在正常情況下,Servlet只會初始化一次,而處理服務會調用多次,銷毀也只會調用一次;但是如果一個Servlet長時間不使用的話,也會被容器自動銷毀,而如果需要再次使用時會重新進行初始化的操作,即在特殊情況下初始化可能會進行多次,銷毀也可能進行多次。
對於service()方法,一般來說這個方法是不需要重寫的,因為在HttpServlet中已經有了很好的實現,它會根據請求的方式,調用doGet(),doPost()方法,也就是說service()是用來轉向的,所以我們一般寫一個Servlet,只需要重寫doGet()或者doPost()就可以了。如果重寫了service()方法,那么Servlet容器就會把請求交給這個方法來處理,倘若你重寫的service()方法沒有調用doXXX(),即使你在Servlet中又重寫了其它doGet(), doPost()等也是不會被調用的,因為Servlet的service()被自動調用(就像init()和destory()方法一樣),所以如果你由於某種需要,需要重寫service()方法,並且根據不同的method調用doPost(),doGet()方法時,就要在末尾加上一句super.service(),這樣就可以解決問題了。