400-650-7353
您所在的位置:首頁 > IT干貨資料 > java > 【Java基礎(chǔ)知識(shí)】Servlet學(xué)習(xí)之Servlet運(yùn)行機(jī)制(五)

【Java基礎(chǔ)知識(shí)】Servlet學(xué)習(xí)之Servlet運(yùn)行機(jī)制(五)

  • 發(fā)布: java培訓(xùn)
  • 來源:Java培訓(xùn)干貨資料
  • 2021-11-29 19:49:12
  • 閱讀()
  • 分享
  • 手機(jī)端入口

一、Servlet運(yùn)行機(jī)制

Servlet是運(yùn)行在Servlet容器中的服務(wù)器端的用來響應(yīng)用戶請(qǐng)求的服務(wù)器小程序,它的生命周期由Servlet容器負(fù)責(zé)管理。

Servlet在Servlet容器中,以單例模式存在,即:在Servlet生命周期中,Servlet容器只創(chuàng)建一個(gè)Servlet對(duì)象,所有的客戶請(qǐng)求都使用這一個(gè)Servlet對(duì)象來響應(yīng)。

當(dāng)用戶請(qǐng)求到達(dá)時(shí),Servlet容器解析請(qǐng)求,檢查內(nèi)存中是否已存在用戶要訪問的Servlet對(duì)象;若存在,則直接使用該Servlet對(duì)象處理用戶請(qǐng)求;若不存在,則加載Servlet,創(chuàng)建Servlet對(duì)象,并實(shí)例化、初始化,然后使用這個(gè)Servlet對(duì)象處理用戶請(qǐng)求。

在Servlet整個(gè)生命周期中,只實(shí)例化和初始化一次,即:只有一個(gè)Servlet實(shí)例對(duì)象為客戶請(qǐng)求提供服務(wù)。

Servlet以單例模式運(yùn)行,即使有多個(gè)用戶同時(shí)訪問Servlet時(shí),Servlet容器中也只有一個(gè)Servlet實(shí)例對(duì)象存在。Servlet容器通過Servlet對(duì)象調(diào)用service()服務(wù)方法時(shí),采用多線程的方式使用Servlet對(duì)象。即:Servlet容器會(huì)為每一個(gè)用戶請(qǐng)求創(chuàng)建一個(gè)線程,由線程調(diào)用Servlet的service()方法為用戶請(qǐng)求提供服務(wù)。

在Servlet容器中,用一個(gè)線程池來管理使用Servlet對(duì)象的多個(gè)線程,線程池在初始化時(shí),會(huì)創(chuàng)建一定數(shù)量的線程對(duì)象放在池子中,當(dāng)需要時(shí),直接獲取線程對(duì)象并使用;使用后,線程對(duì)象歸還線程池;以避免頻繁創(chuàng)建線程、銷毀線程對(duì)象,從而提高Servlet容器的性能。

下圖描述了Servlet的請(qǐng)求與響應(yīng)過程:客戶機(jī)向WEB服務(wù)器發(fā)送請(qǐng)求,WEB服務(wù)器收到請(qǐng)求之后,轉(zhuǎn)發(fā)給Servlet容器,Servlet容器創(chuàng)建HttpServletRequest和HttpServletResponse兩個(gè)對(duì)象,分別封裝請(qǐng)求數(shù)據(jù)和響應(yīng)數(shù)據(jù),并將它們傳給線程池中分配的線程,該線程訪問Servlet處理用戶請(qǐng)求,處理完畢,將結(jié)果返回Servlet容器,線程歸還線程池;最后,WEB服務(wù)器負(fù)責(zé)將響應(yīng)結(jié)果發(fā)送回客戶機(jī)。

二、Servlet生命周期

在Java中,任何對(duì)象都有生命周期。

Servlet生命周期是指Servlet實(shí)例創(chuàng)建到Servlet實(shí)例銷毀的過程。按照功能的不同,大致可以將Servlet的生命周期分為三個(gè)階段:Servlet實(shí)例創(chuàng)建與初始化階段、運(yùn)行階段、銷毀階段。

在Servlet生命周期中,每個(gè)階段用不同的方法,完成各自的任務(wù)。

初始化階段:調(diào)用Servlet的構(gòu)造器和init()方法進(jìn)行實(shí)例化和初始化。

運(yùn)行階段:調(diào)用Servlet的service()方法處理客戶請(qǐng)求。

銷毀階段:調(diào)用Servlet的destroy()方法結(jié)束Servlet的運(yùn)行。

最后,Servlet對(duì)象由Java虛擬機(jī)JVM的垃圾回收器進(jìn)行垃圾回收。

1、初始化階段

Servlet實(shí)例是Servlet容器創(chuàng)建的,并且在整個(gè)Servlet生命周期中,只創(chuàng)建一個(gè)。

Servlet容器會(huì)根據(jù)Servlet在web.xml配置文件中的參數(shù)值,或者@WebServlet注解中的loadOnStartup屬性值,決定在哪個(gè)時(shí)候創(chuàng)建Servlet實(shí)例。

如果參數(shù)值或loadOnStartup屬性值大于等于0,則Servlet容器在應(yīng)用程序啟動(dòng)時(shí),加載Servlet字節(jié)碼文件,并調(diào)用Servlet的構(gòu)造器和init()方法創(chuàng)建Servlet實(shí)例;否則,在客戶第一次訪問Servlet時(shí),Servlet容器調(diào)用Servlet的構(gòu)造器和init()方法創(chuàng)建Servlet實(shí)例。

在整個(gè)Servlet生命周期中,Servlet對(duì)象只實(shí)例化和初始化一次,init()方法只被調(diào)用一次。

init()代碼示例如下:

public void init(ServletConfig arg0) throws ServletException {

// TODO Auto-generated method stub

}

2、運(yùn)行階段

運(yùn)行階段是Servlet生命周期中最重要的一個(gè)階段,在這個(gè)階段,Servlet容器會(huì)反復(fù)調(diào)用Servlet的service()方法處理客戶請(qǐng)求。

當(dāng)Servlet容器接收到用戶請(qǐng)求后,會(huì)為每一個(gè)用戶請(qǐng)求創(chuàng)建代表請(qǐng)求的ServletRequest對(duì)象和代表響應(yīng)的ServletResponse對(duì)象,在調(diào)用service()方法處理用戶請(qǐng)求時(shí),將它們作為參數(shù)傳遞給Servlet的service()方法。service()方法通過ServletRequest對(duì)象,獲取客戶請(qǐng)求信息;通過ServletResponse對(duì)象,生成響應(yīng)結(jié)果。

在整個(gè)Servlet生命周期中,對(duì)于Servlet的每一次用戶訪問請(qǐng)求,Servlet容器都會(huì)調(diào)用一次Servlet的service()方法,并且創(chuàng)建新的ServletRequest對(duì)象和ServletResponse對(duì)象,即:service()方法在 Servlet的整個(gè)生命周期中,會(huì)被多次調(diào)用。

service()代碼示例如下:

public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {

// TODO Auto-generated method stub

arg1.setContentType("text/html; charset=utf-8");

arg1.getWriter().println("這是通過實(shí)現(xiàn)Servlet接口創(chuàng)建的Servlet程序");

}

3、銷毀階段

當(dāng)WEB服務(wù)器關(guān)閉(Servlet容器也就終止了)或WEB應(yīng)用程序被移出Servlet容器時(shí),Servlet會(huì)隨著WEB應(yīng)用程序的關(guān)閉而銷毀。

Servlet容器調(diào)用Servlet的destroy()方法,銷毀Servlet對(duì)象,釋放Servlet對(duì)象占用的資源。

在整個(gè)Servlet生命周期中,Servlet對(duì)象只銷毀一次,于是,destroy()方法只被Servlet容器調(diào)用一次。

特別地:Servlet對(duì)象一旦創(chuàng)建,就一直駐留在內(nèi)存中等待客戶的訪問,直到WEB服務(wù)器關(guān)閉或WEB應(yīng)用程序被移出Servlet容器時(shí),Servlet對(duì)象才會(huì)被銷毀。

destroy()代碼示例如下:

public void destroy() {

// TODO Auto-generated method stub

}

文章“【Java基礎(chǔ)知識(shí)】Servlet學(xué)習(xí)之Servlet運(yùn)行機(jī)制(五)”已幫助

>>本文地址:http://hqfphsz.com/zhuanye/2021/71019.html

THE END  

聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。

1 您的年齡

2 您的學(xué)歷

3 您更想做哪個(gè)方向的工作?

獲取測(cè)試結(jié)果
  • 大前端大前端
  • 大數(shù)據(jù)大數(shù)據(jù)
  • 互聯(lián)網(wǎng)營(yíng)銷互聯(lián)網(wǎng)營(yíng)銷
  • JavaJava
  • Linux云計(jì)算Linux
  • Python+人工智能Python
  • 嵌入式物聯(lián)網(wǎng)嵌入式
  • 全域電商運(yùn)營(yíng)全域電商運(yùn)營(yíng)
  • 軟件測(cè)試軟件測(cè)試
  • 室內(nèi)設(shè)計(jì)室內(nèi)設(shè)計(jì)
  • 平面設(shè)計(jì)平面設(shè)計(jì)
  • 電商設(shè)計(jì)電商設(shè)計(jì)
  • 網(wǎng)頁設(shè)計(jì)網(wǎng)頁設(shè)計(jì)
  • 全鏈路UI/UE設(shè)計(jì)UI設(shè)計(jì)
  • VR/AR游戲開發(fā)VR/AR
  • 網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全
  • 新媒體與短視頻運(yùn)營(yíng)新媒體
  • 直播帶貨直播帶貨
  • 智能機(jī)器人軟件開發(fā)智能機(jī)器人
 

快速通道fast track

近期開班時(shí)間TIME