Servlet的生命週期?
原 https://blog.csdn.net/jassy1994/article/details/54025471
Servlet的生命週期從Servlet類載入,到建立Servlet類例項,Servlet的初始化(真正成為一個Servlet),有請求到來,呼叫service方法(主要工作),直到Servlet被destroy;
1.Servlet類載入:
1.1 啟動web容器後,容器去尋找應用的部署描述檔案(web.xml),從部署描述檔案中讀取到上下文初始化引數,此時建立一個ServletContext物件,應用的所有部分共享此上下文;
1.2 容器為context-param建立String名值對(引數名和引數值均為String型別);
1.3 容器將名值對交給ServletContext物件;
1.4 如果在部署描述檔案中有Listener標籤的話,建立Listener例項;
1.5 容器呼叫Listener的contextInitialized方法,傳入ServletContextEvent物件,此物件包含一個ServletContext引用,事件處理程式碼可以得到上下文初始化引數。
2.建立Servlet類例項:
2.1 容器讀取部署描述檔案中的Servlet標籤,包括初始化引數(init-param);
2.2 容器建立ServletConfig例項;
2.3 容器為servlet初始化引數建立名值對;
2.4 容器用名值對填充ServletConfig;
2.5 容器建立Servlet類的新例項(一般在第一次請求到來時建立,也可通過設定load-on-start引數在容器啟動時建立)。
3.Servlet初始化:
Servlet的init方法在一個生命週期中只被執行一次,呼叫service方法前,初始化必須完成;
在GenericServlet中有兩個init方法,其中有引數的init方法,呼叫了無參的init方法,所以,若需要重寫init方法,只需要重寫無參的。
4.Servlet的service方法:
每次請求到來,都會呼叫service方法,在HttpServlet中,service方法用於判斷請求的方法(不用重寫),而去重寫doGet方法或doPost方法。
5.Servlet的destroy方法:
銷燬Servlet例項時呼叫,意味著Servlet的生命週期結束。