Java Servlet 規範是由 Java 社群流程(Java Community Process, JCP)開發的一組標準介面和協議,定義了 Java Web 應用程式中的 Servlet
和相關元件如何與 Web 伺服器互動。Servlet
規範旨在為 Java Web 應用開發者提供一個統一的、平臺無關的標準,使得開發、部署和管理 Java Web 應用變得更高效和便捷。
Servlet 規範的核心內容包括 Servlet
生命週期、請求和響應處理、會話管理、安全性等。以下是 Java Servlet 規範的詳細描述:
1. Servlet 生命週期
Servlet 生命週期描述了 Servlet
的建立、執行和銷燬過程,由 Servlet 容器(如 Tomcat)進行管理。主要包含以下方法:
-
init()
:當容器載入和初始化Servlet
時呼叫。通常用於初始化資源,例如資料庫連線、檔案資源等。init()
方法在Servlet
的整個生命週期內僅執行一次。 -
service()
:每當有請求到達Servlet
時呼叫,負責響應 HTTP 請求。service()
方法會根據請求的 HTTP 方法(如 GET、POST、PUT、DELETE 等)分發到相應的doGet()
、doPost()
等方法。 -
destroy()
:在Servlet
被解除安裝或應用停止時呼叫。該方法用於釋放Servlet
佔用的資源。destroy()
方法在Servlet
的生命週期內只執行一次。
2. 請求和響應
Servlet 規範規定了如何處理客戶端請求和生成響應。ServletRequest
和 ServletResponse
是處理請求和響應的核心介面。
-
ServletRequest
:封裝了客戶端的請求資訊,包括請求引數、請求頭、請求體、客戶端 IP 地址等。ServletRequest
的子介面HttpServletRequest
專門用於 HTTP 請求,提供了更豐富的 HTTP 特定資訊和方法。 -
ServletResponse
:用於將響應返回給客戶端,包括設定響應狀態碼、響應頭和響應體。ServletResponse
的子介面HttpServletResponse
允許設定 HTTP 狀態碼、Cookie、重定向等 HTTP 特定的響應。
3. Servlet 執行緒模型
Servlet 規範規定了 Servlet
的執行緒模型,以確保執行緒安全:
-
單例項多執行緒:Servlet 容器通常為每個
Servlet
建立一個例項,並使用該例項的多執行緒來處理多個請求。這意味著Servlet
必須是執行緒安全的,避免使用例項變數或確保例項變數的執行緒安全。 -
SingleThreadModel(已廢棄):早期版本提供了
SingleThreadModel
介面來確保每個請求都使用單獨的Servlet
例項處理,但這種方法效率較低,已在現代Servlet
規範中廢棄。
4. 會話管理
Servlet 規範提供了會話管理的機制,用於在客戶端和伺服器之間保持狀態:
-
HTTP Session:
HttpSession
用於在多個請求之間儲存使用者會話資料。HttpSession
可以在會話期間儲存資料,通常以 Cookie 或 URL 重寫的方式在客戶端和伺服器間傳遞會話 ID。 -
Cookie 和 URL 重寫:
HttpServletResponse
提供了設定 Cookie 的方法。若客戶端不支援 Cookie,容器可以透過 URL 重寫的方式將會話 ID 新增到 URL 中,以確保會話的連續性。
5. 過濾器和監聽器
Servlet 規範提供了 Filter
和 Listener
的機制,用於在請求和響應的生命週期中進行預處理和事件監聽:
-
Filter:Filter 允許在請求到達
Servlet
之前和響應返回客戶端之前對請求或響應進行處理。典型應用場景包括身份驗證、日誌記錄、編碼設定等。 -
Listener:Listener 是事件監聽器,用於監聽和處理特定事件(如會話建立、銷燬等)。常用的監聽器包括
ServletContextListener
、HttpSessionListener
和ServletRequestListener
等,分別用於監控應用、會話、請求的生命週期事件。
6. 安全性
Servlet 規範規定了基於角色的訪問控制和認證機制,確保 Web 應用的安全:
-
基於角色的訪問控制:Servlet 規範支援基於角色的訪問控制(Role-Based Access Control, RBAC)。可以透過
web.xml
中的<security-constraint>
定義受保護的資源,並使用<auth-constraint>
配置訪問角色。 -
認證和授權:Servlet 規範支援基本認證(Basic Authentication)、摘要認證(Digest Authentication)、表單認證(Form-Based Authentication)和客戶端證書認證(Client Certificate Authentication)等多種認證方式。
-
SSL/TLS 支援:Servlet 容器可以配置為支援 SSL/TLS 加密,以確保客戶端和伺服器之間通訊的安全性。
7. 非同步處理
從 Servlet 3.0 開始,Servlet 規範引入了非同步處理能力,使 Servlet
能夠在處理長時間任務時不阻塞執行緒:
-
非同步請求:透過
HttpServletRequest
的startAsync()
方法開啟非同步模式,使請求在執行耗時任務時釋放容器執行緒,待任務完成後再由容器將響應返回客戶端。 -
非同步監聽器:非同步處理過程中,可以透過
AsyncListener
監聽任務的開始、完成、超時等事件,以便在特定事件上執行相應操作。
8. 檔案上傳和下載支援
Servlet 3.0 引入了對檔案上傳的支援,允許使用 @MultipartConfig
註解和 getPart()
方法來簡化檔案上傳處理。
-
@MultipartConfig:透過在
Servlet
上使用@MultipartConfig
註解,允許處理multipart/form-data
型別的請求,從而輕鬆實現檔案上傳。 -
getPart() 方法:
HttpServletRequest
提供了getPart()
和getParts()
方法,分別用於獲取單個或多個上傳檔案的內容。
9. 配置和部署
Servlet 規範允許透過註解和配置檔案定義 Servlet
的部署描述:
-
註解:透過註解(如
@WebServlet
、@WebFilter
、@WebListener
)可以定義Servlet
、Filter
和Listener
,使得不需要依賴web.xml
檔案即可配置 Web 應用。 -
web.xml:
web.xml
是 Web 應用的部署描述符檔案,包含了應用的Servlet
、Filter
、Listener
配置以及安全、會話等相關配置資訊。
總結
Java Servlet 規範為 Web 應用的開發提供了清晰的標準和介面,主要內容包括:
- 生命週期管理:定義
Servlet
的初始化、請求處理、銷燬流程。 - 請求和響應處理:透過
ServletRequest
和ServletResponse
提供對 HTTP 請求和響應的封裝。 - 執行緒模型:規定
Servlet
執行緒模型,確保執行緒安全。 - 會話管理:支援
HttpSession
、Cookie 和 URL 重寫等會話保持機制。 - 過濾器和監聽器:透過
Filter
和Listener
提供請求和響應的預處理和事件監聽功能。 - 安全性:支援基於角色的訪問控制、多種認證方式、SSL/TLS 加密。
- 非同步處理:支援非同步請求處理,最佳化長時間任務的資源佔用。
- 檔案上傳和下載:簡化檔案上傳處理。
- 配置和部署:支援註解和
web.xml
配置,便於應用管理。
這些功能和特性確保了 Servlet 在 Web 應用開發中的靈活性和可擴充套件性。