Servlet的生命周期
- 圖解Servlet的生命周期

-
生命周期的各個階段
- 實例化 :Servlet 容器創建 Servlet 的實例
- 初始化 :該容器調用init() 方法
- 請求處理 :如果請求Servlet,則容器調用 service()方法
- 服務終止 :銷毀實例之前調用destroy() 方法
-
Servlet生命周期詳解
Servlet是運行在Servlet容器(有時候也叫Servlet引擎,是web服務器和應用程序服務器的一部分,用於在發送的請求和響應之上提供網絡服務,解碼基於MIME的請求,格式化基於MIME的響應。常用的tomcat、jboss、weblogic都是Servlet容器)中的,其生命周期是由容器來管理。Servlet的生命周期通過java.servlet.Servlet接口中的init()、service()、和destroy()方法表示。Servlet的生命周期有四個階段:加載並實例化、初始化、請求處理、銷毀。
- 加載並實例化
Servlet容器負責加載和實例化Servelt。當Servlet容器啟動時,或者在容器檢測到需要這個Servlet來響應第一個請求時,創建Servlet實例。當Servlet容器啟動后,Servlet通過類加載器來加載Servlet類,加載完成后再new一個Servlet對象來完成實例化。
- 初始化
在Servlet實例化之后,容器將調用init()方法,並傳遞實現ServletConfig接口的對象。在init()方法中,Servlet可以部署描述符中讀取配置參數,或者執行任何其他一次性活動。在Servlet的整個生命周期類,init()方法只被調用一次。
- 請求處理
當Servlet初始化后,容器就可以准備處理客戶機請求了。當容器收到對這一Servlet的請求,就調用Servlet的service()方法,並把請求和響應對象作為參數傳遞。當並行的請求到來時,多個service()方法能夠同時運行在獨立的線程中。通過分析ServletRequest或者HttpServletRequest對象,service()方法處理用戶的請求,並調用ServletResponse或者HttpServletResponse對象來響應。
- 銷毀
一旦Servlet容器檢測到一個Servlet要被卸載,這可能是因為要回收資源或者因為它正在被關閉,容器會在所有Servlet的service()線程之后,調用Servlet的destroy()方法。然后,Servlet就可以進行無用存儲單元收集清理。這樣Servlet對象就被銷毀了。這四個階段共同決定了Servlet的生命周期。

Servlet生命周期,即闡述Servlet從產生到毀滅的整個過程。
在Servlet產生到消亡的過程中,有三個生命周期函數,初始化方法init(),處理客戶請求的方法service(),終止方法destroy()。
init方法
在一個Servlet的生命周期中,init方法只會被執行一次,之后無論用戶執行多少次請求,都不會在調用該方法。
關於init方法的執行時機,有兩種方式可選,一般的是在服務器啟動后第一個用戶請求改Servlet是調用,你也可以設置該Servlet在服務器啟動后自動執行。
init方法負責簡單的創建或者加載一些數據,這些數據將用於該Servlet的整個生命周期中。
service方法
當一個客戶請求改Servlet時,實際的處理工作全部有service方法來完成,service方法用來處理客戶端的請求,並生成格式化數據返回給客戶端。
每一次請求服務器都會開啟一個新的線程並執行一次service方法,service根據客戶端的請求類型,調用doGet、doPost等方法。
service是由web容器來調用的,我們無需對service具體內容做任何處理,service會自動的根據客戶端的請求類型去調用doGet、doPost等方法,所以我們只需要做好doGet、doPost方法的實現就可以了。
destroy方法
該方法在整個生命周期中,也是只會被調用一次,在Servlet對象被銷毀是調用,在servlet中,我們可以做一些資源的釋放等操作,執行destory方法之后的servlet對象,會等待jvm虛擬機的垃圾回收機制擇時回收。
doGet、doPost方法
實際的業務處理流程,service根據客戶端的請求類型來自動匹配需要執行那個方法。
1、什么是生命周期?
生命周期表示一個java對象從最初被創建到最終被銷毀,經歷的所有過程。
2、Servlet對象的生命周期是誰來管理的?程序員可以干涉嗎?
Servlet對象的生命周期,javaweb程序員是無權干涉的,包括該Servlet對象的相關方法的調用,javaweb程序員也是無權干涉的。
Servlet對象從最初的創建,方法的調用,以及最后對象的銷毀,這個過程,是由Web容器來管理的。
Web Container管理Servlet對象的生命周期。
3、“默認情況下”,Servlet對象在WEB服務器啟動階段不會被實例化。【若希望在Web服務器啟動階段實例化Servlet對象,需要進行特殊的設置】
4、描述Servlet對象的生命周期
1)用戶在瀏覽器中輸入Serlvet的URL
2)web容器截取請求鏈接
3)web容器在容器上下文中找請求路徑對應的Servlet對象
4)若沒有找到對應的Servlet對象
4.1)通過web.xml文件中的相關配置信息,得到請求路徑對應的Servlet對象
4.2)通過反射機制,調用Servlet類的無參構造方法完成Servlet對象的實例化
4.3)web容器調用Servlet對象的init方法完成實例化操作
4.4)web容器調用Servlet對象的service方法提供服務
5)若找到對應的Servlet對象
5.1)web容器直接調用Servlet對象的service方法提供服務
6)web容器關閉的時候/webapp重新部署的時候/該Servlet對象長時間沒有用戶再次訪問的時候,web容器會將該Serlvet對象銷毀,在銷毀該對象之前,web容器會調用Servlet對象的destory方法,完成銷毀之前的准備。
5、總結:
5.1)Servlet類的構造方法只執行一次
5.2)Servlet對象的init方法只執行一次
5.3)Servlet對象的service方法,只要用戶請求一次,則執行一次
5.4)Servlet對象的destory方法,只執行一次
6、注意
init方法執行的時候,Servlet對象已經被創建好了。
destory方法執行的時候,Servlet對象還沒有被銷毀,即將被銷毀
7、Servlet對象是單例,但是不符合單例測試,只能稱為偽單例。真單例的構造方法是私有化的,Tomcat服務器是支持多線程的。所以Servlet對象在單實例多線程的環境下運行的。那么Servelet對象中若有示例變量,並且示例變量涉及到修改操作,那么這個Servlet對象一定會存在線程安全問題,不建議在Servlet對象中使用實例變量,盡量使用局部變量。
