Servlet 是獨立於平台協議的服務端 Java 組件,作為瀏覽器請求與數據庫/應用之間的中間層。本文系統總結 Servlet 核心知識體系,適合面試複習與快速查閱。
| 階段 | 方法 | 觸發時機 | 典型操作 |
| 實例化 | 構造器 | 首次請求或啟動加載 | 無參構造,避免複雜邏輯 |
| 初始化 | init(ServletConfig) | 實例化後一次 | 讀取配置、建立連接池、載入資源 |
| 服務 | service(req, resp) | 每次請求 | 業務邏輯處理、分發 doGet/doPost |
| 銷毀 | destroy() | 容器關閉/重新部署 | 釋放資源、關閉連接、保存狀態 |
| 不可用 | - | 銷毀後 | 從內存移除,等待 GC |
關鍵點: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 重定向
| 特性 | 請求轉發 (forward) | 重定向 (sendRedirect) |
| 範圍 | 同一 Web 應用 | 可跨應用、跨域 |
| 瀏覽器地址欄 | 不變 | 變為目標 URL |
| 請求對象 | 共享同一 request | 新請求,原 request 失效 |
| 速度 | 快(服務端內部) | 慢(雙倍網絡往返) |
請求域屬性傳遞數據
request.setAttribute(name, obj)
request.getAttribute(name)
request.getAttributeNames()
request.removeAttribute(name)
Part 6:線程安全問題(高頻面試點)
根因:Servlet 默認單例多線程,成員變量、靜態變量、共享對象(Map、List、DataSource 等)存在競態條件。
解決方案
- 局部變量代替成員變量:方法內定義,線程隔離(最推薦)
- 同步控制:
synchronized 塊鎖定共享資源,縮小鎖粒度,避免鎖住整個 doGet/doPost
- 線程安全集合:
Vector 替代 ArrayList、Hashtable/ConcurrentHashMap 替代 HashMap
- 避免在 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:監聽器(持續更新中)
| 接口 | 監聽事件 |
| ServletContextListener | Web 應用啟動/銷毀 |
| ServletContextAttributeListener | 上下文屬性增刪改 |
| ServletRequestListener | 請求創建/銷毀 |
| ServletRequestAttributeListener | 請求屬性增刪改 |
| HttpSessionListener | Session 創建/銷毀 |
| HttpSessionActivationListener | Session 鈍化/活化(分布式) |
| HttpSessionAttributeListener | Session 屬性增刪改 |
| HttpSessionBindingListener | 對象綁定/解綁 Session |
實現對應接口、重寫方法、在 web.xml 中 <listener> 聲明即可生效。
- 上一篇文章: Java String.format 完整指南:格式化符號、標誌、日期時間與實戰示例
- 下一篇文章: Spring Boot 日志系統完整配置指南:默認格式、輸出控制與自定義配置
Copyright ©
程式碼之家 All Rights Reserved