日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet的生命周期和线程安全问题

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet的生命周期和线程安全问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

Servlet簡(jiǎn)介

Servlet 架構(gòu)圖

Servlet 任務(wù)

Servlet的生命周期

init() 方法

service() 方法

doGet() 方法

doPost() 方法

destroy() 方法

Servlet 生命周期架構(gòu)圖

Servlet的線程安全問題


Servlet簡(jiǎn)介

Java Servlet 是運(yùn)行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請(qǐng)求和 HTTP 服務(wù)器上的數(shù)據(jù)庫或應(yīng)用程序之間的中間層。

使用 Servlet,您可以收集來自網(wǎng)頁表單的用戶輸入,呈現(xiàn)來自數(shù)據(jù)庫或者其他源的記錄,還可以動(dòng)態(tài)創(chuàng)建網(wǎng)頁。

Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共網(wǎng)關(guān)接口)實(shí)現(xiàn)的程序可以達(dá)到異曲同工的效果。但是相比于 CGI,Servlet 有以下幾點(diǎn)優(yōu)勢(shì):

  • 性能明顯更好。
  • Servlet 在 Web 服務(wù)器的地址空間內(nèi)執(zhí)行。這樣它就沒有必要再創(chuàng)建一個(gè)單獨(dú)的進(jìn)程來處理每個(gè)客戶端請(qǐng)求。
  • Servlet 是獨(dú)立于平臺(tái)的,因?yàn)樗鼈兪怯?Java 編寫的。
  • 服務(wù)器上的 Java 安全管理器執(zhí)行了一系列限制,以保護(hù)服務(wù)器計(jì)算機(jī)上的資源。因此,Servlet 是可信的。
  • Java 類庫的全部功能對(duì) Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機(jī)制與 applets、數(shù)據(jù)庫或其他軟件進(jìn)行交互。

Servlet 架構(gòu)圖

Servlet 任務(wù)

  • 讀取客戶端(瀏覽器)發(fā)送的顯式的數(shù)據(jù)。這包括網(wǎng)頁上的 HTML 表單,或者也可以是來自 applet 或自定義的 HTTP 客戶端程序的表單。
  • 讀取客戶端(瀏覽器)發(fā)送的隱式的 HTTP 請(qǐng)求數(shù)據(jù)。這包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等等。
  • 處理數(shù)據(jù)并生成結(jié)果。這個(gè)過程可能需要訪問數(shù)據(jù)庫,執(zhí)行 RMI 或 CORBA 調(diào)用,調(diào)用 Web 服務(wù),或者直接計(jì)算得出對(duì)應(yīng)的響應(yīng)。
  • 發(fā)送顯式的數(shù)據(jù)(即文檔)到客戶端(瀏覽器)。該文檔的格式可以是多種多樣的,包括文本文件(HTML 或 XML)、二進(jìn)制文件(GIF 圖像)、Excel 等。
  • 發(fā)送隱式的 HTTP 響應(yīng)到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文檔類型(例如 HTML),設(shè)置 cookies 和緩存參數(shù),以及其他類似的任務(wù)。

Servlet的生命周期

Servlet對(duì)象的創(chuàng)建 Servlet對(duì)象的初始化 Servlet對(duì)象服務(wù)的執(zhí)行 最終Servlet對(duì)象被銷毀的整個(gè)過程

  • Servlet 初始化后調(diào)用?init ()?方法
  • Servlet 調(diào)用?service()?方法來處理客戶端的請(qǐng)求
  • Servlet 銷毀前調(diào)用?destroy()?方法
  • Servlet 最終是由 JVM 的垃圾回收器進(jìn)行垃圾回收的

init() 方法

init 方法被設(shè)計(jì)成只調(diào)用一次。它在第一次創(chuàng)建 Servlet 時(shí)被調(diào)用,在后續(xù)每次用戶請(qǐng)求時(shí)不再調(diào)用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一樣。

Servlet 創(chuàng)建于用戶第一次調(diào)用對(duì)應(yīng)于該 Servlet 的 URL 時(shí),但是您也可以指定 Servlet 在服務(wù)器第一次啟動(dòng)時(shí)被加載。

當(dāng)用戶調(diào)用一個(gè) Servlet 時(shí),就會(huì)創(chuàng)建一個(gè) Servlet 實(shí)例,每一個(gè)用戶請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的線程,適當(dāng)?shù)臅r(shí)候移交給 doGet 或 doPost 方法。init() 方法簡(jiǎn)單地創(chuàng)建或加載一些數(shù)據(jù),這些數(shù)據(jù)將被用于 Servlet 的整個(gè)生命周期。

service() 方法

service() 方法是執(zhí)行實(shí)際任務(wù)的主要方法。Servlet 容器(即 Web 服務(wù)器)調(diào)用 service() 方法來處理來自客戶端(瀏覽器)的請(qǐng)求,并把格式化的響應(yīng)寫回給客戶端。

每次服務(wù)器接收到一個(gè) Servlet 請(qǐng)求時(shí),服務(wù)器會(huì)產(chǎn)生一個(gè)新的線程并調(diào)用服務(wù)。service() 方法檢查 HTTP 請(qǐng)求類型(GET、POST、PUT、DELETE 等),并在適當(dāng)?shù)臅r(shí)候調(diào)用 doGet、doPost、doPut,doDelete 等方法。

doGet() 方法

GET 請(qǐng)求來自于一個(gè) URL 的正常請(qǐng)求,或者來自于一個(gè)未指定 METHOD 的 HTML 表單,它由 doGet() 方法處理。

doPost() 方法

POST 請(qǐng)求來自于一個(gè)特別指定了 METHOD 為 POST 的 HTML 表單,它由 doPost() 方法處理。

destroy() 方法

destroy() 方法只會(huì)被調(diào)用一次,在 Servlet 生命周期結(jié)束時(shí)被調(diào)用。destroy() 方法可以讓您的 Servlet 關(guān)閉數(shù)據(jù)庫連接、停止后臺(tái)線程、把 Cookie 列表或點(diǎn)擊計(jì)數(shù)器寫入到磁盤,并執(zhí)行其他類似的清理活動(dòng)。

Servlet 生命周期架構(gòu)圖

Servlet的線程安全問題

Servlet是線程不安全的。因?yàn)镾ervlet是單例模式的,當(dāng)不同的請(qǐng)求都調(diào)用這一個(gè)Servlet,只在堆里申請(qǐng)了一個(gè)對(duì)象空間,即只實(shí)例化了一次。所以,不管來了多少請(qǐng)求,都是這一個(gè)實(shí)例在處理。如果多個(gè)請(qǐng)求在同一時(shí)刻出現(xiàn),就會(huì)并發(fā)執(zhí)行。因而導(dǎo)致線程不安全。

總結(jié)

以上是生活随笔為你收集整理的Servlet的生命周期和线程安全问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。