JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究
生命周期速覽
優(yōu)先級(jí)
servlet 的聲明周期由 tomcat 服務(wù)器自行管轄,程序員無法插手;
只要沒有通過 url 訪問 servlet,那他就永遠(yuǎn)不會(huì)先行實(shí)例化;
除非我們通過在 web.xml 的 servlet 標(biāo)簽下加上以下標(biāo)簽,即可立即實(shí)例化:
</load-on-startup/>
該標(biāo)簽內(nèi)也可以填寫整數(shù),整數(shù)越小表示優(yōu)先級(jí)越高:
<load-on-startup>1</load-on-startup>
servlet生命周期完整過程
默認(rèn)情況,服務(wù)器啟動(dòng)后 servlet 對(duì)象不會(huì)立刻初始化
當(dāng)用戶發(fā)送第一次請(qǐng)求時(shí):
- 執(zhí)行 servlet 無參構(gòu)造
- tomcat 調(diào)用 servlet 的 init 方法
- tomcat 繼續(xù)調(diào)用 service 方法
當(dāng)用戶第二次乃至之后多次請(qǐng)求時(shí):
因?yàn)?servlet 是單例的,所以不會(huì)再實(shí)例化新的 servlet 對(duì)象;
即 init 方法僅執(zhí)行一次,而 service 會(huì)在每次調(diào)用時(shí)執(zhí)行一次;
servlet 所有核心方法解析
無參構(gòu)造方法
首次實(shí)例化 servlet 的時(shí)候第一個(gè)調(diào)用的構(gòu)造方法!
每個(gè) servlet 都必須有一個(gè)無參構(gòu)造方法,且不能存在有參構(gòu)造方法?。。?/p>
servlet 規(guī)定,不建議隨意增刪構(gòu)造方法!
init
init 僅會(huì)在首次實(shí)例化 servlet 的時(shí)候執(zhí)行一次;
service
處理用戶請(qǐng)求的方法;
每次調(diào)用 servlet 都會(huì)執(zhí)行一次;
destroy
servlet 銷毀前(注意是銷毀前!?。。﹫?zhí)行的方法;
僅執(zhí)行一次
適配器模式去除冗余接口
因?yàn)樵谝粋€(gè) servlet 中,最常用的接口實(shí)際上就只有 init 和 service 倆,故需要隱去其他不常用的接口來保證代碼的整潔度;
解決方式:構(gòu)造一個(gè)通用的抽象類 NormalServlet,并設(shè)置僅 service 為抽象方法,此時(shí)所有繼承該抽象類的子類就近需要實(shí)現(xiàn)唯一的 service 抽象方法了!
代碼清單:NormalServlet.java
package com.zhiyiyi.javaweb.servlet; import jakarta.servlet.*; import java.io.IOException; // 請(qǐng)注意此類為抽象類 public abstract class NormalServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } // 僅設(shè)置service方法為一個(gè)抽象方法 @Override public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException; @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
代碼清單:CServlet.java
package com.zhiyiyi.javaweb.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import java.io.IOException; public class CServlet extends NormalServlet{ // 可見,目前就近需要實(shí)現(xiàn)唯一的service了,代碼簡(jiǎn)潔了許多!??! @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { } }
這還沒完,我們需要再次對(duì) NormalServlet
進(jìn)行些許優(yōu)化,好讓子類能夠獲取父類的 ServletConfig
對(duì)象
首先聲明一個(gè)私有的 ServletConfig 對(duì)象,之后于 init 方法內(nèi)進(jìn)行實(shí)例化;
之后子類就可以通過調(diào)用父類中的 getServletConfig
方法來獲取 ServletConfig 對(duì)象了?。?!
private ServletConfig config; @Override public void init(ServletConfig servletConfig) throws ServletException { this.config = servletConfig; } @Override public ServletConfig getServletConfig() { return config; }
GenericServlet.java
這個(gè)玩意是 servlet 提供的官方版本,用來替換我們剛剛編寫的 NormalServlet 的;
它的功能更加齊全,且能應(yīng)對(duì)子類需要重寫 init 方法的需求;
以后我們編寫 servlet 只需要繼承 GenericServlet
就好了;
到此這篇關(guān)于JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究的文章就介紹到這了,更多相關(guān)JavaWeb Servlet 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例
- Springboot如何添加server.servlet.context-path相關(guān)使用
- Java Servlet線程中AsyncContext異步處理Http請(qǐng)求
- Java?Servlet實(shí)現(xiàn)表白墻的代碼實(shí)例
- Java servlet后端開發(fā)超詳細(xì)教程
- JavaWeb通過IDEA配置Servlet操作流程詳解
- JavaWeb ServletConfig作用及原理分析講解
- Java中Servlet的生命周期詳解
- 淺談一下Servlet的定義以及運(yùn)行原理
相關(guān)文章
scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法
這篇文章主要介紹了scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法
這篇文章主要介紹了MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12JDK9對(duì)String字符串的新一輪優(yōu)化
這篇文章主要介紹了JDK9對(duì)String字符串的新一輪優(yōu)化,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解
這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過定義一個(gè)配置類,自定義RedisTemplate的序列化方式,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09動(dòng)態(tài)上傳jar包熱部署的實(shí)戰(zhàn)詳解
開發(fā)系統(tǒng)過程中遇到的一個(gè)需求,系統(tǒng)給定一個(gè)接口,用戶可以自定義開發(fā)該接口的實(shí)現(xiàn),并將實(shí)現(xiàn)打成jar包,上傳到系統(tǒng)中。系統(tǒng)完成熱部署,并切換該接口的實(shí)現(xiàn)。本文詳細(xì)介紹了實(shí)現(xiàn)方法,需要的可以參考一下2022-10-10JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案
這篇文章主要為大家介紹了Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11