JavaWEB中Servlet的生命周期詳解
一、什么是Servlet 生命周期?
Servlet 對(duì)象什么時(shí)候被創(chuàng)建?
Servlet對(duì)象什么時(shí)候被銷毀?
Servlet 對(duì)象創(chuàng)建了幾個(gè)?
Servlet 對(duì)象的聲明周期表示:Servlet 對(duì)象從出生到銷毀的過程是怎樣的
二、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)造方法 并沒有被啟動(dòng),說明 Tomcat 啟動(dòng)時(shí) 并不會(huì)提前創(chuàng)建對(duì)象。
我們可以看到,當(dāng)我們?cè)跒g覽器中發(fā)送請(qǐng)求時(shí),這個(gè)無(wú)參構(gòu)造方法才會(huì)執(zhí)行,說明:只有用戶發(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í)行了,說明創(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 并沒有被創(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ì)象沒有被銷毀,這是因?yàn)?destroy 方法是 實(shí)例方法,需要對(duì)象來(lái)調(diào)用次方法。在執(zhí)行之后 對(duì)象才會(huì)被銷毀
Tomcat 響應(yīng)請(qǐng)求的過程:
1、Tomcat 的配置文件中保存 路徑請(qǐng)求 與 Servlet 的對(duì)應(yīng)關(guān)系。Tomcat 根據(jù)瀏覽器中的URL,分析URL找到 AServlet 類
2、通過反射機(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ò)誤。
所以在開發(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中申請(qǐng)不定長(zhǎng)度數(shù)組ArrayList的方法
今天小編就為大家分享一篇java中申請(qǐng)不定長(zhǎng)度數(shù)組ArrayList的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-07-07java實(shí)現(xiàn)fibonacci數(shù)列學(xué)習(xí)示例分享(斐波那契數(shù)列)
這篇文章主要介紹了fibonacci數(shù)列(斐波那契數(shù)列)示例,大家參考使用吧2014-01-01SpringBoot2.x 整合Spring-Session實(shí)現(xiàn)Session共享功能
這篇文章主要介紹了SpringBoot2.x 整合Spring-Session實(shí)現(xiàn)Session共享功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解代理模式
代理模式是Java常見的設(shè)計(jì)模式之一。所謂代理模式是指客戶端并不直接調(diào)用實(shí)際的對(duì)象,而是通過調(diào)用代理,來(lái)間接的調(diào)用實(shí)際的對(duì)象2022-04-04java實(shí)現(xiàn)全局監(jiān)聽鍵盤詳解
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)全局監(jiān)聽鍵盤的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2024-01-01spring boot自定義配置時(shí)在yml文件輸入有提示問題及解決方案
自定義一個(gè)配置類,然后在yml文件具體配置值時(shí),一般不會(huì)有提示,今天小編給大家分享spring boot自定義配置時(shí)在yml文件輸入有提示問題,感興趣的朋友一起看看吧2023-10-10