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

Servlet 3.0+ @WebServlet 註解完整指南:替代 web.xml 的零配置映射

     編輯:Java 綜合教學

Servlet 3.0+ @WebServlet 註解完整指南

Servlet 3.0 引入註解配置,徹底擺脫繁瑣的 web.xml 映射。本文系統講解 @WebServlet 全屬性用法、多 URL 映射、啟動加載順序、異步處理配置及與 web.xml 混合部署的優先級規則。

一、基礎用法:單 URL 映射

@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.getWriter().write("Hello, Annotation!");
    }
}
  • 等價於 <servlet-mapping><url-pattern>/hello.do</url-pattern></servlet-mapping>;
  • 類名默認作為 servlet-name(全限定名),可通過 name 屬性覆蓋。

二、完整屬性速查表

屬性類型默認值說明
value / urlPatternsString[]{}核心屬性,URL 模式數組,至少一個。兩屬性二選一,value 為簡寫。
nameString全限定類名Servlet 邏輯名,用於 ServletContext.getServletRegistration() 查找。
loadOnStartupint-1>0:容器啟動時實例化並 init();數值越小優先級越高。-1:首次請求時懶加載。
initParams@WebInitParam[]{}初始化參數,等價 <init-param>,getInitParameter() 獲取。
asyncSupportedbooleanfalse啟用 Servlet 3.0 異步處理(req.startAsync()),長輪詢/推送必開。
descriptionString""文檔描述,管理控制台顯示。
displayNameString""工具顯示名。
smallIcon/largeIconString""圖標路徑,極少用。

三、進階配置示例

@WebServlet(
    name = "OrderServlet",
    urlPatterns = { "/order/create", "/order/query", "/order/*" },
    loadOnStartup = 1,
    initParams = {
        @WebInitParam(name = "pageSize", value = "20"),
        @WebInitParam(name = "maxRetries", value = "3")
    },
    asyncSupported = true,
    description = "訂單核心處理 Servlet"
)
public class OrderServlet extends HttpServlet {
    private int pageSize;
    private int maxRetries;

    @Override
    public void init() throws ServletException {
        pageSize = Integer.parseInt(getInitParameter("pageSize"));
        maxRetries = Integer.parseInt(getInitParameter("maxRetries"));
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 異步處理示例
        AsyncContext ctx = req.startAsync();
        ctx.start(() -> {
            try { Thread.sleep(2000); } catch (InterruptedException ignored) {}
            ctx.getResponse().getWriter().write("Async Done");
            ctx.complete();
        });
    }
}

四、URL 模式匹配規則(與 web.xml 一致)

  1. 精確匹配:/order/create 只匹配該路徑;
  2. 路徑前綴:/order/* 匹配 /order/ 及其子路徑;
  3. 擴展名映射:*.do、*.action 匹配對應後綴;
  4. 默認 Servlet:/ 匹配所有未被其他模式匹配的請求(靜態資源通常由 DefaultServlet 處理)。

優先級:精確 > 最長前綴 > 擴展名 > 默認。

五、與 web.xml 混合部署的優先級

  • Servlet 3.0 規範:web.xml 中的 <servlet>、<servlet-mapping> 覆蓋 註解配置;
  • web.xml 中 <absolute-ordering> 可控制掃描順序,甚至禁用註解掃描(<absolute-ordering/> 空標籤);
  • 建議:全項目統一風格,新項目全註解,遺留項目全 XML,避免混用導致維護混亂。

六、常見坑與避坑指南

現象原因修正
404 Not FoundURL 模式寫錯(如漏了 / 前綴)模式必須以 / 或 *. 開頭
啟動報錯 "Duplicate servlet mapping"多個 Servlet 註解映射同一 URL檢查 urlPatterns 去重
initParams 讀取為 null拼寫錯誤或未在 init() 中調用 getInitParameter大小寫敏感,建議常量定義 key
異步超時 / IllegalStateException未設置 asyncSupported=true 或未調用 ctx.complete()必開屬性,確保所有分支 complete
loadOnStartup 不生效值 ≤ 0 或容器不支持(極少見)設置 ≥ 1 的整數

七、最佳實踐總結

  1. 核心業務 Servlet:loadOnStartup=1 預熱,減少首請求延遲;
  2. 異步長連接 Servlet:asyncSupported=true + 線程池異步執行;
  3. 參數外部化:initParams 僅放極少數不變常量,業務配置走 Spring @Value/Nacos;
  4. 命名規範:name 使用業務語義(如 OrderCreateServlet),便於監控與管理;
  5. 測試驗證:啟動後訪問 https://host:port/manager/html (Tomcat Manager) 查看 Servlet 註冊表,確認映射生效。
「註解配置讓 Servlet 成為真正的 POJO 組件,零 XML 侵入。善用 loadOnStartup 預熱、asyncSupported 異步,能讓 Servlet 容器在高併發下跑出非阻塞的性能。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved