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

Servlet 技術全總結:原理、生命周期、API、線程安全、過濾器與監聽器

     編輯:Java 綜合教學

Servlet 技術全總結:原理、生命周期、API、線程安全、過濾器與監聽器

Servlet 是獨立於平台協議的服務端 Java 組件,作為瀏覽器請求與數據庫/應用之間的中間層。本文系統總結 Servlet 核心知識體系,適合面試複習與快速查閱。

Part 1:運行原理

  • Web 服務器接收 HTTP 請求 → 靜態資源自行處理 → 動態請求交給 Servlet 容器
  • 容器首次請求創建 Servlet 實例(單例),後續請求啟動新線程調用 service()
  • 多線程模式節省內存,提高並發效率

Part 2:核心優勢

優勢說明
跨平台Java 編寫,一次編寫到處運行
可移植Servlet API 標準化,易遷移至其他容器
高效率線程模型而非進程模型,輕量級
功能豐富表單處理、HTTP 頭操作、Cookie、Session 跟蹤

Part 3:基礎類結構

  • HttpServlet 繼承 GenericServlet,子類至少重寫 doGet() 或 doPost()
  • 兩方法均由 GenericServlet.service() 根據 HTTP 方法分發調用

Part 4:生命周期(由容器管理)

關鍵點:ServletConfig 提供初始化參數與 ServletContext 訪問;初始化失敗拋出 UnavailableException 會重試。

Part 5:核心 API 概覽

輸入/輸出流

  • ServletInputStream:讀取請求二進制數據,readLine() 按行讀取
  • ServletOutputStream:輸出二進制響應,print()/println() 重載多種類型

請求/響應接口體系

ServletRequest → HttpServletRequest (含 getParameter*, getAttribute*, getInputStream 等)
ServletResponse → HttpServletResponse (含 getWriter, getOutputStream, sendRedirect 等)

配置與上下文

  • ServletConfig:單個 Servlet 配置(init-param、servlet-name、ServletContext)
  • ServletContext:全局上下文(跨 Servlet 共享數據、獲取資源路徑、MIME 類型、日志記錄)

請求參數獲取

getParameter(name)           // 單值
getParameterValues(name)     // 多值(複選框、多選)
getParameterNames()          // 所有參數名 Enumeration
getParameterMap()            // 所有參數 Map

中文亂碼處理

  • POST:request.setCharacterEncoding("UTF-8") 在讀取參數前調用
  • GET:Tomcat 8+ 默認 UTF-8,舊版需配置 URIEncoding="UTF-8" 或 URL 編碼

請求轉發 vs 重定向

階段方法觸發時機典型操作
實例化構造器首次請求或啟動加載無參構造,避免複雜邏輯
初始化init(ServletConfig)實例化後一次讀取配置、建立連接池、載入資源
服務service(req, resp)每次請求業務邏輯處理、分發 doGet/doPost
銷毀destroy()容器關閉/重新部署釋放資源、關閉連接、保存狀態
不可用-銷毀後從內存移除,等待 GC

請求域屬性傳遞數據

request.setAttribute(name, obj)
request.getAttribute(name)
request.getAttributeNames()
request.removeAttribute(name)

Part 6:線程安全問題(高頻面試點)

根因:Servlet 默認單例多線程,成員變量、靜態變量、共享對象(Map、List、DataSource 等)存在競態條件。

解決方案

  1. 局部變量代替成員變量:方法內定義,線程隔離(最推薦)
  2. 同步控制:synchronized 塊鎖定共享資源,縮小鎖粒度,避免鎖住整個 doGet/doPost
  3. 線程安全集合:Vector 替代 ArrayList、Hashtable/ConcurrentHashMap 替代 HashMap
  4. 避免在 Servlet 創建線程:交由容器線程池或異步任務框架

Part 7:過濾器

核心接口:javax.servlet.Filter

init(FilterConfig)           // 初始化,獲取 init-param
doFilter(req, res, chain)    // 核心邏輯,chain.doFilter() 傳遞給下一個
destroy()                    // 銷毀釋放資源

應用場景:字符編碼過濾器

public class CharacterEncodingFilter implements Filter {
    private String encoding;
    public void init(FilterConfig config) { encoding = config.getInitParameter("encoding"); }
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
            throws IOException, ServletException {
        if (encoding != null) req.setCharacterEncoding(encoding);
        chain.doFilter(req, res);
    }
}

web.xml 配置與過濾鏈順序

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.example.CharacterEncodingFilter</filter-class>
    <init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

鏈執行順序:按 web.xml 聲明順序,進入時 A→B,返回時 B→A。

Part 8:監聽器(持續更新中)

特性請求轉發 (forward)重定向 (sendRedirect)
範圍同一 Web 應用可跨應用、跨域
瀏覽器地址欄不變變為目標 URL
請求對象共享同一 request新請求,原 request 失效
速度快(服務端內部)慢(雙倍網絡往返)

實現對應接口、重寫方法、在 web.xml 中 <listener> 聲明即可生效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
接口監聽事件
ServletContextListenerWeb 應用啟動/銷毀
ServletContextAttributeListener上下文屬性增刪改
ServletRequestListener請求創建/銷毀
ServletRequestAttributeListener請求屬性增刪改
HttpSessionListenerSession 創建/銷毀
HttpSessionActivationListenerSession 鈍化/活化(分布式)
HttpSessionAttributeListenerSession 屬性增刪改
HttpSessionBindingListener對象綁定/解綁 Session