JavaWEB中Servlet的生命周期詳解
一、什么是Servlet 生命周期?
Servlet 對(duì)象什么時(shí)候被創(chuàng)建?
Servlet對(duì)象什么時(shí)候被銷毀?
Servlet 對(duì)象創(chuàng)建了幾個(gè)?
Servlet 對(duì)象的聲明周期表示:Servlet 對(duì)象從出生到銷毀的過(guò)程是怎樣的
二、Servlet 是由誰(shuí)來(lái)維護(hù)的?
Servlet 是由 Tomcat 服務(wù)器全權(quán)負(fù)責(zé)的,程序員無(wú)法干預(yù)。
Tomcat 又叫 WEB 容器。
我們自己 new 的 Servlet 對(duì)象 是不受 WEB 容器 管理的。
WEB 容器 自己創(chuàng)建的 Servlet 對(duì)象,會(huì)放到一個(gè)集合中【Map集合】,自己創(chuàng)建的 Servlet 是不會(huì)放到這個(gè)集合中的。這個(gè)集合保存了 請(qǐng)求路徑 和 Servlet 對(duì)象 的對(duì)應(yīng)關(guān)系。
三、Servlet 對(duì)象 是什么時(shí)候創(chuàng)建的?
在 Servlet 類中 寫一個(gè)無(wú)參構(gòu)造方法,當(dāng)Tomcat 啟動(dòng)時(shí) 這個(gè)無(wú)參構(gòu)造方法 并沒(méi)有被啟動(dòng),說(shuō)明 Tomcat 啟動(dòng)時(shí) 并不會(huì)提前創(chuàng)建對(duì)象。


我們可以看到,當(dāng)我們?cè)跒g覽器中發(fā)送請(qǐng)求時(shí),這個(gè)無(wú)參構(gòu)造方法才會(huì)執(zhí)行,說(shuō)明:只有用戶發(fā)送請(qǐng)求時(shí),這個(gè)Servlet 對(duì)象 才會(huì)被創(chuàng)建。

那么可不可以讓 Tomcat 提前創(chuàng)建對(duì)象?
是可以的,在配置文件中 增加一行代碼即可
<?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>StudentList</servlet-name>
<!--完整包名-->
<servlet-class>yangzhaoguang.servlet.StudentServlet</servlet-class>
<!--設(shè)置Tomcat啟動(dòng)時(shí),創(chuàng)建對(duì)象、這里必須是正整數(shù),越小優(yōu)先級(jí)越高-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>StudentList</servlet-name>
<!--請(qǐng)求路徑-->
<url-pattern>/servlet/Student</url-pattern>
</servlet-mapping>
</web-app>
當(dāng)設(shè)置之后,Tomcat 啟動(dòng)時(shí) ,無(wú)參構(gòu)造方法執(zhí)行了,說(shuō)明創(chuàng)建對(duì)象成功。但是這個(gè)方法不常用,提前創(chuàng)建對(duì)象會(huì)耗費(fèi)內(nèi)存。
四、測(cè)試 Tomcat 什么時(shí)候被銷毀?
我們?cè)?新建一個(gè)模塊,在模塊中新建一個(gè) AServlet 類 并 編寫三個(gè)方法

修改配置文件,并重新部署 Servlet
<?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>yangzhaoguang.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<!--請(qǐng)求路徑-->
<url-pattern>/a</url-pattern>
</servlet-mapping>
</web-app>
當(dāng)我們啟動(dòng)Tomcat 時(shí),Servlet 并沒(méi)有被創(chuàng)建

第一次發(fā)送請(qǐng)求時(shí), init 和 service 被調(diào)用。Servlet 對(duì)象被創(chuàng)建

當(dāng)我們不停的刷新網(wǎng)頁(yè),每提交一次請(qǐng)求 service 方法就會(huì)執(zhí)行一次,init 方法 只會(huì)在第一次用戶請(qǐng)求時(shí)執(zhí)行一次

當(dāng)我們關(guān)閉 Tomcat 服務(wù)器時(shí),會(huì)銷毀 AServlet 的內(nèi)存,destroy 方法執(zhí)行了。
在執(zhí)行 destroy 方法時(shí),對(duì)象沒(méi)有被銷毀,這是因?yàn)?destroy 方法是 實(shí)例方法,需要對(duì)象來(lái)調(diào)用次方法。在執(zhí)行之后 對(duì)象才會(huì)被銷毀

Tomcat 響應(yīng)請(qǐng)求的過(guò)程:

1、Tomcat 的配置文件中保存 路徑請(qǐng)求 與 Servlet 的對(duì)應(yīng)關(guān)系。Tomcat 根據(jù)瀏覽器中的URL,分析URL找到 AServlet 類
2、通過(guò)反射機(jī)制先調(diào)用 AServlet 中的無(wú)參構(gòu)造方法創(chuàng)建對(duì)象,執(zhí)行 init 完成初始化工作,調(diào)用 service 方法處理用戶的請(qǐng)求。【無(wú)參構(gòu)造方法是在init 方法執(zhí)行之前先執(zhí)行】
3、當(dāng)服務(wù)器關(guān)閉時(shí),執(zhí)行 destroy 方法。執(zhí)行之后銷毀對(duì)象。
創(chuàng)建對(duì)象(無(wú)參方法執(zhí)行)----> 初始化(init 方法執(zhí)行)----> 提供服務(wù)(service方法執(zhí)行) ----> 銷毀(destroy方法執(zhí)行)
當(dāng) Servlet 類中 有一個(gè) 有參數(shù)構(gòu)造時(shí),會(huì)報(bào)錯(cuò)嗎?
會(huì)報(bào)錯(cuò):500錯(cuò)誤。一般情況下是服務(wù)端的java小程序出現(xiàn)了錯(cuò)誤。

所以在開(kāi)發(fā)中,不建議自己創(chuàng)建構(gòu)造方法。
思考一下:既然無(wú)參構(gòu)造方法和 init 方法都是在Servlet對(duì)象創(chuàng)建時(shí)執(zhí)行并只執(zhí)行一次,那么 無(wú)參構(gòu)造方法可以替代 init 方法嗎?
不可以,因?yàn)樵赟ervlet 不建議構(gòu)建有參數(shù)構(gòu)造方法,所以 init 可以替代有參數(shù)構(gòu)造方法。
總結(jié)
到此這篇關(guān)于JavaWEB中Servlet的生命周期詳解的文章就介紹到這了,更多相關(guān)JavaWEB Servlet生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Annotation注解相關(guān)原理代碼總結(jié)
這篇文章主要介紹了Java Annotation注解相關(guān)原理代碼總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java實(shí)現(xiàn)數(shù)組轉(zhuǎn)字符串及字符串轉(zhuǎn)數(shù)組的方法分析
這篇文章主要介紹了Java實(shí)現(xiàn)數(shù)組轉(zhuǎn)字符串及字符串轉(zhuǎn)數(shù)組的方法,結(jié)合實(shí)例形式分析了Java字符串及數(shù)組相關(guān)的分割、遍歷、追加等操作技巧,需要的朋友可以參考下2018-06-06
Java:com.netflix.client.ClientException錯(cuò)誤解決
本文主要介紹了Java:com.netflix.client.ClientException錯(cuò)誤解決,主要是指出客戶端?module-sso?試圖通過(guò)負(fù)載均衡器訪問(wèn)服務(wù)時(shí),負(fù)載均衡器沒(méi)有找到可用的服務(wù)器來(lái)處理請(qǐng)求,下面就來(lái)介紹一下解決方法2024-08-08
Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA過(guò)程圖解
這篇文章主要介紹了Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
SparkStreaming-Kafka通過(guò)指定偏移量獲取數(shù)據(jù)實(shí)現(xiàn)
這篇文章主要為大家介紹了SparkStreaming-Kafka通過(guò)指定偏移量獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Maven工程引入依賴失敗Dependencies全部飄紅問(wèn)題
這篇文章主要介紹了Maven工程引入依賴失敗Dependencies全部飄紅問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
在Java中將jsonObject轉(zhuǎn)換成對(duì)象的實(shí)現(xiàn)方法
在現(xiàn)代的Web開(kāi)發(fā)中,JSON作為一種輕量級(jí)的數(shù)據(jù)交換格式,因其易讀性和易于解析的特點(diǎn)而被廣泛使用,本文將介紹如何在Java中將??jsonObject??轉(zhuǎn)換成Java對(duì)象,主要通過(guò)使用Gson庫(kù)來(lái)實(shí)現(xiàn)這一功能,需要的朋友可以參考下2025-04-04
java中基本數(shù)據(jù)類型與Object的關(guān)系說(shuō)明
這篇文章主要介紹了java基本數(shù)據(jù)類型與Object的關(guān)系說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

