所謂生命週期,指的是servlet容器如何創建servlet實例、分配其資源、調用其方法、並銷燬其實例的整個過程。
階段一: 實例化(就是創建servlet對象,調用構造器)
在如下兩種情況下會進行對象實例化。
第一種情況:當請求到達容器時,容器查找該servlet對象是否存在,如果不存在,纔會創建實例。
第二種情況:容器在啓動時,或者新部署了某個應用時,會檢查web.xml當中,servlet是否有 load-on-starup配置。如果有,則會創建該servlet實例。load-on-starup參數值越小,優先級越高(最小值爲0,優先級最高)。
階段二: 初始化
爲servlet分配資源,調用init(ServletConfig config);方法config對象可以用來訪問servlet的初始化參數。初始化參數是使用init-param配置的參數。init可以override。
階段三: 就緒/調用
有請求到達容器,容器調用servlet對象的service()方法。
HttpServlet的service()方法,會依據請求方式來調用doGet()或者doPost()方法。但是,這兩個do方法默認情況下,會拋出異常,需要子類去override。
階段四: 銷燬
容器依據自身的算法,將不再需要的servlet對象刪除掉。
在刪除之前,會調用servlet對象的destroy()方法。
destroy()方法用於釋放資源。
在servlet的整個生命週期當中,init,destroy只會執行一次,而service方法會執行多次。