首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

How Tomcat Works 讀書筆記 Chapter 2:Servlet 容器核心實現

     編輯:關於C++

第一章回顧:簡易 HTTP 服務器

  • HttpServer.await() 監聽 8080 端口,接收 Socket。
  • 從 InputStream 解析請求 URI,構建自定義 Request 對象。
  • 用 OutputStream 構建 Response,調用 sendStaticResource() 返回靜態頁面。

第二章改進:標準 Servlet 容器

核心接口:javax.servlet.Servlet

所有 Servlet 必須實現:

public interface Servlet {
    void init(ServletConfig config);
    ServletConfig getServletConfig();
    void service(ServletRequest req, ServletResponse res);
    String getServletInfo();
    void destroy();
}

生命周期:init(一次)→ 多次 service → destroy(卸載時)。

Servlet 容器職責

  1. 首次請求加載 Servlet 類(Class.forName 或 URLClassLoader),實例化並調用 init。
  2. 每次請求構造 ServletRequest、ServletResponse 實例(實現標準接口)。
  3. 調用 service(req, res)。
  4. 容器關閉時調用 destroy 並卸載類。

類加載機制

使用 URLClassLoader 指定 repository(類目錄),調用 loadClass 加載 Servlet 類。注意雙親委派模型:若 classpath 已有同名類,無法加載 repository 中的版本。

第二章類結構

  • HttpServer:監聽端口,分發請求。
  • Request / Response:實現 ServletRequest/ServletResponse 接口,多數方法留空。
  • ServletProcessor:處理 Servlet 請求,加載類、調用 service。
  • StaticResourceProcessor:處理靜態資源請求。

建議抽象 Processor 接口統一兩者。

請求處理流程

// HttpServer.await()
while (true) {
    Socket socket = serverSocket.accept();
    InputStream is = socket.getInputStream();
    OutputStream os = socket.getOutputStream();
    Request request = new Request(is);
    request.parse(); // 解析 URI 等
    Response response = new Response(os);
    response.setRequest(request);
    if (request.getUri().startsWith("/servlet/")) {
        ServletProcessor processor = new ServletProcessor();
        processor.process(request, response);
    } else {
        StaticResourceProcessor processor = new StaticResourceProcessor();
        processor.process(request, response);
    }
    socket.close();
}

總結

第二章確立了 Tomcat 核心架構:標準 Servlet API 接口、類加載器隔離、請求分發處理器模式。這為後續章節的連接器、容器、生命周期管理奠定基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved