原理說明
架構
讓我們了解客戶端-服務器架構。
- 用戶將HTTP請求發送到Web服務器;
- 服務器具有包含Servlet的Web容器,該容器從數據庫收集數據并創建響應;
- Servlet創建的響應通過HTTP響應發送到客戶端瀏覽器。
不過問題是,如何將Servlet的響應轉換為HTTP響應格式?由于Web服務器僅在HTTP協議上工作,因此Web容器會處理從Servlet響應到HTTP響應的這種轉換。
Web容器
Web容器也稱為Servlet容器或Servlet引擎,它為JavaEE(j2ee)應用程序提供了運行時環境,客戶端/用戶只能從服務器請求靜態網頁。如果用戶想按輸入讀取網頁,則在Java中使用Web容器。因此,它實現了ServletAPI和處理HTTP請求所需的服務。
Web容器通過調用Servlet類的service()方法來初始化與請求的URL匹配的Servlet;在Web容器協議內的單獨線程中處理為給定HTTP請求調用的service()方法。
- 用戶將HTTP請求發送到Web服務器;
- Web服務器將請求轉發到Web容器;
- Web容器以請求對象的形式將請求轉發到Servlet;
- Servlet構建響應對象并將其發送回Web容器;
- Web容器將響應對象轉換為等效的HTTP響應,并將其發送到Web服務器;
- Web服務器通過HTTP響應將響應發送回客戶端。
生命周期
Servlet生命周期包含的方法涵蓋了從創建到銷毀的整個過程。以下是生命周期步驟:
- init()僅被調用一次。僅在創建Servlet時調用它,因此,它用于一次性初始化。通常,在用戶首次調用與該Servlet相對應的URL時創建Servlet,但是你也可以指定在首次啟動服務器時應加載哪個Servlet;
- service()方法是執行實際任務的主要方法。Web容器(Servlet容器)調用service()方法來處理來自客戶端的請求。每當服務器收到對Servlet的請求時,Web容器就會生成一個新線程并調用service()。此方法檢查HTTP請求類型(GET、POST、PUT、DELETE等),并在適當時調用doGet、doPost、doPut、doDelete等方法;
- 在Servlet的生命周期結束時,只會調用一次destroy()方法。此方法使Servlet有機會關閉數據庫連接,暫停后臺線程并執行其他此類清理任務。執行destroy()方法后,將Servlet對象標記為可用于垃圾回收;
- 最后,Servlet對象是由JVM的垃圾收集器收集的垃圾。
如何協同工作?
- 首先,到達服務器的并發HTTP請求被轉發到Web容器;
- Web容器在調用service()方法之前啟動Servlet;
- 然后,Web容器通過產生多個線程來處理多個請求,每個線程執行該Servlet單個實例的service()方法。