Servlet (Server Applet) 是運行在支援 Java 的應用伺服器上的伺服器端程式,主要功能:交互式瀏覽/修改資料、生成動態 Web 內容。狹義指實現 javax.servlet.Servlet 介面的類,廣義指任何實現該介面的類。
init(ServletConfig config),僅執行一次service(ServletRequest, ServletResponse),每請求一次執行一次
doGet、doPost、doPut、doDelete、doHead、doOptions、doTracedestroy(),釋放資源service()ThreadLocal
Client (瀏覽器)
│ HTTP Request
▼
Web Server (Tomcat/Jetty)
│ 解析請求、建立 Request/Response 物件
▼
Servlet Container
│ 找到對應 Servlet、確保已初始化
▼
Servlet.service(req, resp)
│ 業務邏輯、資料庫操作、生成回應
▼
Web Server
│ 封裝 HTTP Response
▼
Client
│ 渲染顯示
| 維度 | Servlet | JSP |
|---|---|---|
| 本質 | Java 類 | 最終編譯為 Servlet 類 |
| HTML 生成 | out.println("...") 痛苦 | 直接寫 HTML 標籤,極其方便 |
| 業務邏輯 | 適合寫複雜業務邏輯 (Controller) | 不適合大量 Java 代碼 (View) |
| 分工 | 控制層、業務層 | 表現層 |
| MVC 角色 | Controller | View |
| 修改 HTML | 需重新編譯 Java 檔 | 修改 JSP 即時生效 (開發模式) |
| 介面/類 | 核心方法 | 用途 |
|---|---|---|
| HttpServletRequest | getParameter, getHeader, getSession, getAttribute, getInputStream | 獲取請求資訊、表單數據、Session、屬性、請求體 |
| HttpServletResponse | setContentType, setStatus, addHeader, getWriter, getOutputStream | 設定回應類型、狀態碼、頭、輸出文字/二進制 |
| HttpSession | getAttribute, setAttribute, invalidate, getId | 會話層級資料共享 |
| ServletContext | getInitParameter, getAttribute, setAttribute, getResourceAsStream | 應用層級全域配置/資源 |
| ServletConfig | getInitParameter, getServletName, getServletContext | 單一 Servlet 初始化參數 |
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("歡迎來到 Servlet 世界!
");
out.println("當前時間: " + new java.util.Date() + "
");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee" version="3.1">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup> <!-- 啟動時初始化,數值越小優先級越高 -->
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
@WebServlet(
name = "MyServlet",
urlPatterns = {"/hello", "/hi"},
loadOnStartup = 1,
initParams = {
@WebInitParam(name = "author", value = "ZhangSan"),
@WebInitParam(name = "version", value = "1.0")
}
)
public class MyServlet extends HttpServlet { ... }
@WebFilter 實現登入檢查、編碼設定、日誌記錄、XSS 防護、靜態資源快取@WebListener 監聽 ServletContext (應用啟動/銷毀)、HttpSession (建立/銷毀/屬性變更)、ServletRequest 等生命週期事件webappsreloadable="true" 或 IDE 支援)catalina.out / localhost.yyyy-mm-dd.log 排查錯誤curl -v / Postman 測試 API-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005