Servlet物件生命周期
先給出代碼:
import javax.servlet.*;
import java.io.IOException;
public class aServlet implements Servlet {
public aServlet() {
System.out.println("aServlet無引數構造方法執行了");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("aServlet's init method execute!");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("aServlet's service method execute!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("aServlet's destroy method execute!");
}
}
// bServlet類似aServlet
xml組態檔:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>aServlet</servlet-name>
<servlet-class>com.baidu.controller.aServlet</servlet-class>
<!--<load-on-startup>1</load-on-startup>-->
</servlet>
<servlet-mapping>
<servlet-name>aServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>bServlet</servlet-name>
<servlet-class>com.baidu.controller.bServlet</servlet-class>
<!--<load-on-startup>0</load-on-startup>-->
</servlet>
<servlet-mapping>
<servlet-name>bServlet</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
</web-app>
-
什么是Servlet物件生命周期?
- Servlet物件什么時候被創建,
- Servlet物件什么時候被銷毀,
- Servlet物件創建了幾個?
- Servlet物件的生命周期表示:一個Servlet物件從出生在最后的死亡,整個程序是怎樣的,
-
Servlet物件是由誰來維護的?
- Servlet物件的創建,物件上方法的呼叫,物件最終的銷毀,Javaweb程式員是無權干預的,
- Servlet物件的生命周期是由Tomcat服務器(WEB Server)全權負責的,
- Tomcat服務器通常我們又稱為:WEB容器,(這個叫法你要知道【WEB Container】)
- WEB容器來管理Servlet物件的死活,
-
思考:我們自己new的Servlet物件受WEB容器的管理嗎?
- 我們自己new的Servlet物件是不受WEB容器管理的,
- WEB容器創建的Servlet物件,這些Servlet物件都會被放到一個集合當中(HashMap),只有放到這個HashMap集合中的Servlet才能夠被WEB容器管理,自己new的Servlet物件不會被WEB容器管理,(自己new的Servlet物件不在容器當中)
- web容器底層應該有一個HashMap這樣的集合,在這個集合當中存盤了Servlet物件和請求路徑之間的關系
- /a -> aServlet
- /b -> bServlet
- …

-
研究:服務器在啟動的Servlet物件有沒有被創建出來(默認情況下)?
- 在Servlet中提供一個無引數的構造方法(里面加輸出陳述句),然后啟動服務器的時候看看構造方法(有沒有輸出陳述句)是否執行,
- 經過測驗得出結論:默認情況下,服務器在啟動的時候Servlet物件并不會被實體化,
- 這個設計是合理的,用戶沒有發送請求之前,如果提前創建出來所有的Servlet物件,必然是耗費記憶體的,并且創建出來的Servlet如果一直沒有用戶訪問,顯然這個Servlet物件是一個廢物,沒必要先創建,
-
怎么讓服務器啟動的時候創建Servlet物件呢?
-
在servlet標簽中添加==子標簽,在該子標簽中填寫整數,==越小的整數優先級越高,
-
<servlet> <servlet-name>aservlet</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>aservlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping>
-
-
Servlet物件生命周期
-
默認情況下服務器啟動的時候AServlet物件并沒有被實體化
-
用戶發送第一次請求的時候,控制臺輸出了以下內容:
aServlet無引數構造方法執行了 aServlet's init method execute! aServlet's service method execute! -
根據以上輸出內容得出結論:
- 用戶在發送第一次請求的時候Servlet物件被實體化(aServlet的構造方法被執行了,并且執行的是無引數構造方法,)
- aServlet物件被創建出來之后,Tomcat服務器馬上呼叫了aServlet物件的init方法,(init方法在執行的時候,aServlet物件已經存在了,已經被創建出來了,)
- 用戶發送第一次請求的時候,init方法執行之后,Tomcat服務器馬上呼叫aServlet物件的service方法,
-
用戶繼續發送第二次請求,控制臺輸出了以下內容:
AServlet's service method execute! -
根據以上輸出結果得知,用戶在發送第二次,或者第三次,或者第四次請求的時候,==Servlet物件并沒有新建,還是使用之前創建好的Servlet物件,直接呼叫該Servlet物件的service方法,==這說明:
- 第一:Servlet物件是單例的(單實體的,但是要注意:Servlet物件是單實體的,但是Servlet類并不符合單例模式,我們稱之為假單例,之所以單例是因為Servlet物件的創建我們javaweb程式員管不著,這個物件的創建只能是Tomcat來說了算,Tomcat只創建了一個,所以導致了單例,但是屬于假單例,真單例模式,構造方法是私有化的,)
- 第二:無引數構造方法、init方法只在第一次用戶發送請求的時候執行,也就是說無引數構造方法只執行一次,init方法也只被Tomcat服務器呼叫一次,
- 第三:只要用戶發送一次請求:service方法必然會被Tomcat服務器呼叫一次,發送100次請求,service方法會被呼叫100次,
-
關閉服務器的時候,控制臺輸出了以下內容:
aServlet's destroy method execute! -
通過以上輸出內容,可以得出以下結論:
- Servlet的destroy方法只被Tomcat服務器呼叫一次,
- destroy方法是在什么時候被呼叫的?
- 在服務器關閉的時候,
- 因為服務器關閉的時候要銷毀aServlet物件的記憶體,
- 服務器在銷毀aServlet物件記憶體之前,Tomcat服務器會自動呼叫aServlet物件的destroy方法,
-
請問:destroy方法呼叫的時候,物件銷毀了還是沒有銷毀呢?
- destroy方法執行的時候aServlet物件==還在,沒有被銷毀,==destroy方法執行結束之后,aServlet物件的記憶體才會被Tomcat釋放,
-
Servlet物件更像一個人的一生:
- Servlet的無引數構造方法執行:標志著你出生了,
- Servlet物件的init方法的執行:標志著你正在接受教育,
- Servlet物件的service方法的執行:標志著你已經開始作業了,已經開始為人類提供服務了,
- Servlet物件的destroy方法的執行:標志著臨終,有什么遺言,抓緊的,要不然,來不及了,
-
關于Servlet類中方法的呼叫次數?
- 構造方法只執行一次,
- init方法只執行一次,
- service方法:用戶發送一次請求則執行一次,發送N次請求則執行N次,
- destroy方法只執行一次,
-
當我們Servlet類中撰寫一個有引數的構造方法,如果沒有手動撰寫無引數構造方法會出現什么問題?
- 報錯了:500錯誤,
- 注意:500是一個HTTP協議的錯誤狀態碼,
- 500一般情況下是因為服務器端的Java程式出現了例外,(服務器端的錯誤都是500錯誤:服務器內部錯誤,)
- 如果沒有無引數的構造方法,會導致出現500錯誤,無法實體化Servlet物件,
- 所以,一定要注意:在Servlet開發當中,不建議程式員來定義構造方法,因為定義不當,一不小心就會導致無法實體化Servlet物件,
-
思考:Servlet的無引數構造方法是在物件第一次創建的時候執行,并且只執行一次,init方法也是在物件第一次創建的時候執行,并且只執行一次,那么這個無引數構造方法可以代替掉init方法嗎?
- 不能,
- Servlet規范中有要求,作為javaweb程式員,==撰寫Servlet類的時候,不建議手動撰寫構造方法,==因為撰寫構造方法,很容易讓無引數構造方法消失(程式員寫了有引數的構造方法,很有可能就忘記了無參的構造方法),這個操作可能會導致Servlet物件無法實體化,所以init方法是有存在的必要的,
-
init、service、destroy方法中使用最多的是哪個方法?
- 使用最多就是service方法,service方法是一定要實作的,因為service方法是處理用戶請求的核心方法,
- 什么時候使用init方法呢?
- init方法很少用,
- 通常在init方法當中做初始化操作,并且這個初始化操作只需要執行一次,例如:初始化資料庫連接池,初始化執行緒池…
- 什么時候使用destroy方法呢?
- destroy方法也很少用,
- 通常在destroy方法當中,進行資源的關閉,馬上物件要被銷毀了,還有什么沒有關閉的,抓緊時間關閉資源,還有什么資源沒保存的,抓緊時間保存一下,
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393911.html
標籤:java
