web.xml 中 url-pattern 設定解析

螺旋质子發表於2024-12-05

在 web.xml 中使用 filter-mapping、servlet-mapping 節點下的子節點 url-pattern 配置對映。

Pattern 匹配規則

精確匹配

配置和請求的 URL 完全相同。

<servlet-mapping>
  <servlet-name>indexServlet</servlet-name>
  <url-pattern>/index</url-pattern>
</servlet-mapping>

同時請求 URL 為 /index,這時就是精確匹配。

副檔名匹配

以“*.”開頭的字串被認為是副檔名匹配。

<servlet-mapping>
  <servlet-name>indexServlet</servlet-name>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>

此時任何以 .action 結尾的 URL (不包括引數部分)就會匹配這條規則。

路經匹配

以“/”字元開頭,並以“/*”結尾的字串用於路徑匹配。

<servlet-mapping>
  <servlet-name>adminServlet</servlet-name>
  <url-pattern>/admin/*</url-pattern>
</servlet-mapping>

此時任何以 /admin/ 開頭的 URL (不包括引數部分)就會匹配這條規則。

路徑匹配和副檔名匹配不能同一個 pattern 中使用。

匹配優先順序

優先順序從高到底分別是:精確匹配 > 路徑匹配 > 副檔名匹配,其中長路經優先順序高於短路經。

匹配例子

ServletA ServletB 請求URL 匹配結果 備註
/index /* /index ServletA 精確匹配高於路徑匹配
/admin/* /admin/user/* /admin/user/index ServletB 長路徑匹配高於短路經
*.action /* /index.action ServletB 路徑匹配高於副檔名匹配

特殊 Pattern

特殊 Pattern 有著不同的特殊指代,並且時常在配置 Spring, SpringMVC 框架時使用。

先說兩個概念:

  1. 預設 Servlet:容器自帶的處理靜態資源、列出目錄、檔案下載的 Servlet;
  2. JSP Servlet:處理 jsp 請求的Servlet。

下面是特殊 Pattern 的用法:

/*

/* 覆蓋所有其他 Servlet,包括預設 Servlet 和 JSP 處理的Servlet,使請求無法到達他們兩者,造成功能異常。一般之用作Filter配置,可以對所有請求進行過濾。

/

/ 覆蓋預設 Servlet,處理沒有匹配到任何規則的請求,常用作 MVC 分發控制器的對映。

空白字串

空白字串的規則匹配 webapp 的根目錄,和 的區別是空白字串只對映根目錄,不對映子目錄。

完結

特殊 Pattern 部分寫得比較零散,讀者可以參考英文連結。

參考連結

  1. https://stackoverflow.com/questions/4140448/difference-between-and-in-servlet-mapping-url-pattern

相關文章