在 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-name)與全限定類名(servlet-class)。url-pattern),兩處 servlet-name 必須完全一致。| 模式類型 | 語法示例 | 匹配示例 | 說明 |
|---|---|---|---|
| 精確匹配 | /servlet/MyServlet.do | 僅匹配 /servlet/MyServlet.do | 路徑完全一致,優先級最高 |
| 目錄匹配 | /servlet/* | /servlet/abc、/servlet/a/b | 以 / 開頭、/* 結尾,匹配該目錄下所有子路徑 |
| 擴展名匹配 | *.do | /action.do、/a/b/c.do | 以 *. 開頭,匹配所有該後綴請求 |
特殊模式 / 定義默認 Servlet(處理所有未匹配請求),區別於 /*(攔截所有請求含靜態資源)。
url-pattern。/test/* vs /test/b/*,請求 /test/b 命中後者。*.ext。/ 處理。/*.action 同時屬於目錄匹配(以 / 開頭 /* 結尾)與擴展名匹配(以 *. 開頭),導致容器無法判斷類型,部署會報錯或行為未定義。
/ 與 /*:/ 僅作為最後兜底,不攔截 JSP/靜態資源;/* 會攔截所有請求,導致靜態資源(CSS/JS/圖片)無法訪問,需額外配置 <mime-mapping> 或使用 DefaultServlet。/Servlet 不匹配 /servlet。<servlet> 可對應多個 <servlet-mapping>,實現多入口訪問同一處理邏輯。現代項目推薦使用 @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> | 安全角色引用,配合認證授權 |