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

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

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

一、Servlet運行機制

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

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

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

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

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

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

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

二、Servlet生命周期

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

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

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

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

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

銷(xiāo)毀階段:調用Servlet的destroy()方法結束Servlet的運行。

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

1、初始化階段

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

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

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

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

init()代碼示例如下:

public void init(ServletConfig arg0) throws ServletException {

// TODO Auto-generated method stub

}

2、運行階段

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

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

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

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("這是通過(guò)實(shí)現Servlet接口創(chuàng )建的Servlet程序");

}

3、銷(xiāo)毀階段

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

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

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

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

destroy()代碼示例如下:

public void destroy() {

// TODO Auto-generated method stub

}

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

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

THE END  

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

1 您的年齡

2 您的學(xué)歷

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

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

快速通道fast track

近期開(kāi)班時(shí)間TIME