JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究
生命周期速覽
優(yōu)先級(jí)
servlet 的聲明周期由 tomcat 服務(wù)器自行管轄,程序員無(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 無(wú)參構(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 所有核心方法解析
無(wú)參構(gòu)造方法
首次實(shí)例化 servlet 的時(shí)候第一個(gè)調(diào)用的構(gòu)造方法!
每個(gè) servlet 都必須有一個(gè)無(wú)參構(gòu)造方法,且不能存在有參構(gòu)造方法?。?!
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 倆,故需要隱去其他不常用的接口來(lái)保證代碼的整潔度;
解決方式:構(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 方法來(lái)獲取 ServletConfig 對(duì)象了?。。?/p>
private ServletConfig config;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.config = servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return config;
}GenericServlet.java
這個(gè)玩意是 servlet 提供的官方版本,用來(lái)替換我們剛剛編寫的 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)文章
springboot實(shí)現(xiàn)簡(jiǎn)單的消息對(duì)話的示例代碼
本文主要介紹了springboot實(shí)現(xiàn)簡(jiǎn)單的消息對(duì)話的示例代碼,可以使用WebSocket技術(shù),WebSocket是一種在客戶端和服務(wù)器之間提供實(shí)時(shí)雙向通信的協(xié)議,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
SpringBoot任意版本集成Swagger各種版本的操作指南
在學(xué)習(xí)Swagger生成API文檔的時(shí)候經(jīng)常會(huì)遇到問題,而目前市面上大部分技術(shù)分享者的SpringBoot版本并沒和我們的同步,導(dǎo)致一些一模一樣的代碼,在我們的項(xiàng)目上卻無(wú)法使用,這是一個(gè)經(jīng)常性的問題,本文章就旨在和大家搞定SpringBoot任意版本集成Swagger各種版本2024-07-07
Eclipse搭建spring開發(fā)環(huán)境圖文教程(推薦)
下面小編就為大家?guī)?lái)一篇Eclipse搭建spring開發(fā)環(huán)境圖文教程(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-07-07
java開發(fā)web前端cookie session及token會(huì)話機(jī)制詳解
如果把人體比作一個(gè)web系統(tǒng)的話,cookie、session和token就好像人體的經(jīng)絡(luò)和血管一樣,而web系統(tǒng)中的數(shù)據(jù),就好像人體的血液一樣。血液依靠著血管在人體內(nèi)流動(dòng),就如數(shù)據(jù)根據(jù)cookie和session機(jī)制在web系統(tǒng)中流動(dòng)一樣2021-10-10

