1. 程式人生 > >Servlet url-pattern的匹配總結

Servlet url-pattern的匹配總結

url的寫法

  • 完全匹配
    以“/”開頭,以字母(非”*”)結束,如<url-pattern>/test/list.do</url-pattern>
  • 目錄匹配
    以“/”開頭,並以 /* 結尾,如<url-pattern>/test/</url-pattern> 或者<url-pattern>/</url-pattern>
  • 副檔名匹配
    以* 開頭,以副檔名結束,如<url-pattern>*.do</url-pattern>
  • 預設匹配
    “/” 用來表示對應的servlet 為預設的servelet

匹配過程

當一個請求傳送到servlet的時候,容器先會將請求的url減去當前應用上下文路徑,作為servelet對映的url,比如我訪問的是

http://localhost/test/aa/bb.action,容器會將 http://localhost/test 去掉,剩下的 aa/bb.action拿來做servlet的對映匹配。這個匹配是有順序的,並且有一個servlet匹配成功後,就不會取匹配其他servlet(filter與此不同),匹配的規則和順序如下
1. 精確路徑匹配。例子:比如servletA 的url-pattern為 /test,servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test ,這個時候容器就會先 進行精確路徑匹配,發現/test正好被servletA精確匹配,那麼就去呼叫servletA,也不會去理會其他的servlet了。
2. 最長路徑匹配。例子:servletA的url-pattern為/test/,而servletB的url-pattern為/test/a/
,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這裡的servletB。
3. 擴充套件匹配,如果url最後一段包含擴充套件,容器將會根據擴充套件選擇合適的servlet。例子:servletA的url-pattern:*.action
4. 如果前面三條規則都沒有找到一個servlet,容器會根據url選擇對應的請求資源。如果應用定義了一個default servlet,則容器會將請求丟給default servlet