首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Servlet 入門核心知識體系

     編輯:Java 綜合教學

Servlet 入門核心知識體系

什麼是 Servlet?

Servlet 是運行在 Web 容器(如 Tomcat、Jetty)中的 Java 類別,處理 HTTP 請求並生成響應。它是 Java Web 開發的基石,Spring MVC、Struts 等框架底層皆基於 Servlet API。

核心 API 與介面

介面/類別說明
javax.servlet.Servlet 核心介面,定義 init()、service()、destroy() 生命週期方法
javax.servlet.GenericServlet 協議無關的抽象基類,實作 Servlet 與 ServletConfig
javax.servlet.http.HttpServlet HTTP 專用抽象類,繼承 GenericServlet,提供 doGet()、doPost() 等方法
ServletRequest / HttpServletRequest 封裝客戶端請求資訊(參數、Header、Session、Body)
ServletResponse / HttpServletResponse 封裝伺服器響應(狀態碼、Header、輸出流)
ServletContext Web 應用全域上下文,共享資源、配置參數、日誌
HttpSession 會話管理,跨請求保持用戶狀態

Servlet 生命週期

  1. 載入與實例化:容器啟動或首次請求時,透過無參建構子建立實例
  2. 初始化:呼叫 init(ServletConfig config),僅執行一次
  3. 服務請求:每個請求呼叫 service(),HTTP 請求再分派至 doGet()/doPost() 等
  4. 銷毀:容器關閉或重新部署前呼叫 destroy(),釋放資源

部署配置

web.xml 傳統配置

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
    <init-param>
        <param-name>configPath</param-name>
        <param-value>/WEB-INF/config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

Servlet 3.0+ 註解配置(推薦)

@WebServlet(
    urlPatterns = "/api/*",
    initParams = @WebInitParam(name = "configPath", value = "/WEB-INF/config.xml"),
    loadOnStartup = 1
)
public class MyServlet extends HttpServlet {
    @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        // 處理 GET 請求
    }
}

請求處理流程

1. 客戶端發送 HTTP 請求
2. Web 容器解析請求,建立 HttpServletRequest / HttpServletResponse
3. 根據 URL 模式匹配 Servlet
4. 呼叫 service() → doGet()/doPost() 等
5. Servlet 邏輯處理,輸出響應
6. 容器將響應發送給客戶端

核心功能實作要點

獲取請求參數

String name = req.getParameter("name");
String[] hobbies = req.getParameterValues("hobby");
Map<String, String[]> allParams = req.getParameterMap();

請求轉發與重導向

// 轉發(伺服器端跳轉,URL 不變,共享 request)
req.getRequestDispatcher("/target.jsp").forward(req, resp);

// 重導向(客戶端跳轉,URL 改變,新 request)
resp.sendRedirect("/another");

Session 管理

HttpSession session = req.getSession();           // 獲取或建立
HttpSession session = req.getSession(false);      // 僅獲取,不存在回傳 null
session.setAttribute("user", userObj);
User user = (User) session.getAttribute("user");
session.invalidate();  // 銷毀 Session

檔案上傳

@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        Part filePart = req.getPart("file");
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
        try (InputStream in = filePart.getInputStream()) {
            Files.copy(in, Paths.get("/upload/path/" + fileName));
        }
    }
}

Servlet 與 Filter、Listener 的關係

  • Filter:請求/響應攔截鏈(編碼、日誌、授權、XSS 防護)
  • Listener:監聽 Web 應用事件(ServletContextListener、HttpSessionListener、ServletRequestListener)
  • 三者共同構成 Java Web 核心組件模型

常見問題與最佳實踐

  1. 執行緒安全:Servlet 實例預設單例多執行緒共享,不要在 Servlet 類別中定義非執行緒安全的實例變數,改用區域變數或 ThreadLocal
  2. 流關閉:使用 try-with-resources 確保 InputStream/OutputStream 正確關閉
  3. 異常處理:配置 <error-page> 或使用 @ControllerAdvice(Spring MVC)統一處理
  4. 非同步處理:Servlet 3.1+ 支援 AsyncContext,長耗時操作可釋放容器執行緒
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved