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

【Java基礎(chǔ)知識】Servlet學習之Servlet運行機制(五)

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

一、Servlet運行機制

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

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

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

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

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

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

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

二、Servlet生命周期

在Java中,任何對象都有生命周期。

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

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

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

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

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

最后,Servlet對象由Java虛擬機JVM的垃圾回收器進行垃圾回收。

1、初始化階段

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

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

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

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

init()代碼示例如下:

public void init(ServletConfig arg0) throws ServletException {

// TODO Auto-generated method stub

}

2、運行階段

運行階段是Servlet生命周期中最重要的一個階段,在這個階段,Servlet容器會反復調(diào)用Servlet的service()方法處理客戶請求。

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

在整個Servlet生命周期中,對于Servlet的每一次用戶訪問請求,Servlet容器都會調(diào)用一次Servlet的service()方法,并且創(chuàng)建新的ServletRequest對象和ServletResponse對象,即:service()方法在 Servlet的整個生命周期中,會被多次調(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("這是通過實現(xiàn)Servlet接口創(chuàng)建的Servlet程序");

}

3、銷毀階段

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

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

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

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

destroy()代碼示例如下:

public void destroy() {

// TODO Auto-generated method stub

}

文章“【Java基礎(chǔ)知識】Servlet學習之Servlet運行機制(五)”已幫助

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

THE END  

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

1 您的年齡

2 您的學歷

3 您更想做哪個方向的工作?

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

快速通道fast track

近期開班時間TIME