Servlet生命週期詳細過程
轉載:https://wenda.so.com/q/1390360764063375?src=300
servlet生命週期
Servlet執行在Servlet容器中,其生命週期由容器來管理。Servlet的生命週期通過javax.servlet.Servlet介面中的init()、service()和destroy()方法來表示。Servlet的生命週期包含了下面4個階段:
- 載入和例項化
Servlet容器負責載入和例項化Servlet。當Servlet容器啟動時,或者在容器檢測到需要這個Servlet來響應第一個請求時,建立Servlet例項。當Servlet容器啟動後,它必須要知道所需的Servlet類在什麼位置,Servlet容器可以從本地
2.初始化
在Servlet例項化之後,容器將呼叫Servlet的init()方法初始化這個物件。初始化的目的是為了讓Servlet物件在處理客戶端請求前完成一些初始化的工作,如建立資料庫的連線,獲取配置資訊等。對於每一個Servlet例項,init()方法只被呼叫一次。在初始化期間,Servlet例項可以使用容器為它準備的ServletConfig物件從Web
3.
Servlet容器呼叫Servlet的service()方法對請求進行處理。要注意的是,在service()方法呼叫之前,init()方法必須成功執行。在service()方法中,Servlet例項通過ServletRequest物件得到客戶端的相關資訊和請求資訊,在對請求進行處理後,呼叫ServletResponse物件的方法設定響應資訊。在service()方法執行期間,如果發生錯誤,Servlet例項可以丟擲ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該例項永久不可用,Servlet容器將呼叫例項的destroy()方法,釋放該例項。此後對該例項的任何請求,都將收到容器傳送的HTTP 404(請求的資源不可用)響應。如果UnavailableException異常指示了該例項暫時不可用,那麼在暫時不可用的時間段內,對該例項的任何請求,都將收到容器傳送的HTTP 503(伺服器暫時忙,不能處理請求)響應。
4.服務終止
當容器檢測到一個Servlet例項應該從服務中被移除的時候,容器就會呼叫例項的destroy()方法,以便讓該例項可以釋放它所使用的資源,儲存資料到持久儲存裝置中。當需要釋放記憶體或者容器關閉時,容器就會呼叫Servlet例項的destroy()方法。在destroy()方法呼叫之後,容器會釋放這個Servlet例項,該例項隨後會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會建立一個新的Servlet例項。
在整個Servlet的生命週期過程中,建立Servlet例項、呼叫例項的init()和destroy()方法都只進行一次,當初始化完成後,Servlet容器會將該例項儲存在記憶體中,通過呼叫它的service()方法,為接收到的請求服務。