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

JavaWeb Servlet 配置詳解:web.xml 核心映射規則與容器匹配機制

     編輯:Java 程式設計入門

Servlet 配置雙重結構

在 web.xml 中註冊 Servlet 需要兩組標籤配合:

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.Servlet.MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/Servlet</url-pattern>
</servlet-mapping>
  • <servlet>:定義邏輯名稱(servlet-name)與全限定類名(servlet-class)。
  • <servlet-mapping>:將邏輯名稱映射至 URL 模式(url-pattern),兩處 servlet-name 必須完全一致。

三種 URL 模式匹配規則

模式類型語法示例匹配示例說明
精確匹配/servlet/MyServlet.do僅匹配 /servlet/MyServlet.do路徑完全一致,優先級最高
目錄匹配/servlet/*/servlet/abc、/servlet/a/b以 / 開頭、/* 結尾,匹配該目錄下所有子路徑
擴展名匹配*.do/action.do、/a/b/c.do以 *. 開頭,匹配所有該後綴請求

特殊模式 / 定義默認 Servlet(處理所有未匹配請求),區別於 /*(攔截所有請求含靜態資源)。

容器查找優先級算法

  1. 精確匹配:優先查找完全一致的 url-pattern。
  2. 最長目錄匹配:精確匹配失敗,在目錄模式中選擇路徑最長者。
    例:/test/* vs /test/b/*,請求 /test/b 命中後者。
  3. 擴展名匹配:目錄匹配失敗,按後綴匹配 *.ext。
  4. 默認 Servlet:以上均無匹配,交給 / 處理。

常見誤區與避坑指南

⚠ 禁用混合模式:/*.action 同時屬於目錄匹配(以 / 開頭 /* 結尾)與擴展名匹配(以 *. 開頭),導致容器無法判斷類型,部署會報錯或行為未定義。
  • 區分 / 與 /*:
    / 僅作為最後兜底,不攔截 JSP/靜態資源;/* 會攔截所有請求,導致靜態資源(CSS/JS/圖片)無法訪問,需額外配置 <mime-mapping> 或使用 DefaultServlet。
  • 大小寫敏感:URL 模式匹配區分大小寫,/Servlet 不匹配 /servlet。
  • 多映射同一 Servlet:一個 <servlet> 可對應多個 <servlet-mapping>,實現多入口訪問同一處理邏輯。

註解式配置(Servlet 3.0+)

現代項目推薦使用 @WebServlet 註解替代 web.xml:

@WebServlet(
    name = "MyServlet",
    urlPatterns = {"/servlet/MyServlet", "*.do"},
    loadOnStartup = 1,
    initParams = {@WebInitParam(name = "config", value = "value")}
)
public class MyServlet extends HttpServlet { ... }
  • urlPatterns 或 value 支持多模式,等價於多個 servlet-mapping。
  • loadOnStartup > 0 表示容器啟動時實例化,數值越小優先級越高。

進階配置參數速查

參數作用
<init-param>Servlet 初始化參數,通过 getInitParameter() 獲取
<load-on-startup>啟動加載順序,正整數越小越早
<async-supported>true</async-supported>啟用異步處理(Servlet 3.0+)
<multipart-config>文件上傳配置(maxFileSize、location 等)
<security-role-ref>安全角色引用,配合認證授權
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved