欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究

 更新時(shí)間:2022年10月09日 17:01:27   作者:知奕奕  
Servlet指在服務(wù)器端執(zhí)行的一段Java代碼,可以接收用戶的請(qǐng)求和返回給用戶響應(yīng)結(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaWeb.servlet生命周期的相關(guān)資料,需要的朋友可以參考下

生命周期速覽

優(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud Feign原理詳解

    Spring Cloud Feign原理詳解

    Feign 主要是幫助我們方便進(jìn)行rest api服務(wù)間的調(diào)用,本文從Spring Cloud對(duì)feign封裝的源碼中去了解其主要實(shí)現(xiàn)機(jī)制
    2021-06-06
  • scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法

    scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法

    這篇文章主要介紹了scala 隱式轉(zhuǎn)換與隱式參數(shù)的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法

    MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法

    這篇文章主要介紹了MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • JDK9對(duì)String字符串的新一輪優(yōu)化

    JDK9對(duì)String字符串的新一輪優(yōu)化

    這篇文章主要介紹了JDK9對(duì)String字符串的新一輪優(yōu)化,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解

    Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解

    這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過定義一個(gè)配置類,自定義RedisTemplate的序列化方式,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 動(dòng)態(tài)上傳jar包熱部署的實(shí)戰(zhàn)詳解

    動(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-10
  • JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解

    JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Json在Struts中的轉(zhuǎn)換與傳遞方法

    Json在Struts中的轉(zhuǎn)換與傳遞方法

    下面小編就為大家?guī)硪黄狫son在Struts中的轉(zhuǎn)換與傳遞方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • Mybatis-Spring源碼分析圖解

    Mybatis-Spring源碼分析圖解

    這篇文章主要介紹了Mybatis-Spring源碼分析,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案

    Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案

    這篇文章主要為大家介紹了Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評(píng)論