一、映射什麼?
一個請求發送到 servlet 容器,servlet 容器會將當前請求的 url 路徑減去 協議、端口號、contextPath,剩下 servletPath 就是用來做 url-pattern 映射的部分。
如:
http://localhost:8080/myservlet/DisplayHeader?method=show
http: 傳輸協議
localhost: 主機地址
8080: 端口號
myservlet: contextPath
DisplayHeader: servletPath
method=show: 參數
所以要做 url-pattern 映射的部分就是 "DisplayHeader" 部分。
二、映射
1.映射規則
(1)精確匹配:在url-pattern標簽中指定一個具體的URL地址,其中不使用任何的通配符,例如:/target.jsp
(2)模糊匹配:在url-pattern標簽中指定一個帶有通配符的URL地址
<1>前綴匹配:URL地址前面確定,後面使用通配符,例如:/happy/*
<2>後綴匹配:URL地址後面確定,前面使用通配符,例如:*.jsp,*.jpg
<3>注意:不能在URL地址中間使用通配符,例如:/happy/*.jsp是不允許的
(3)還有一種:"/"
2.Wrapper :Wrapper 代表一個 Servlet,它負責管理一個 Servlet,包括的 Servlet 的裝載、初始化、執行以及資源回收。
(1)前綴匹配的 servlet 會被丟到 wildcardWrappers 中。
(2)後綴匹配的 servlet 會被丟到 extensionWrappers 中。
(3)"/" 會被丟到 defaultWrapper 中。
(4)其他映射被丟到 exactWrappers 中。
3.優先級的高低
(1)精確匹配,使用 contextVersion 的 exactWrappers
(2)前綴匹配,使用 contextVersion 的 wildcardWrappers
(3)後綴匹配,使用contextVersion的extensionWrappers(tomcat 自動為我們加入處理 .jsp 和 .jspx 路徑)
(4)使用資源文件來處理servlet,使用contextVersion的welcomeResources屬性,這個屬性是個字符串數組(servletPath 如果什麼都不輸入的話,則會先來映射welcomeResources)
(5)使用默認的servlet,使用contextVersion的defaultWrapper
簡單來說:
精確匹配的優先級>前綴匹配(/*)>後綴匹配(*.action)> servletPath 為空(默認會訪問 welcomeResources) > "/"。
三、參考資料
http://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html
四、常見問題
1.為什麼 servlet 的 url-pattern 要配置為 "/",而 filter 的 url-pattern 要配置為 "/*"?
"/*" 的優先級較高,對於大部分 url 請求都能進行過濾,甚至我們訪問 index.jsp 這樣的文件都需要走這個映射。對於 servlet 而言,不是希望看到的。
對於 filter 來說,不會像servlet那樣只匹配一個servlet,因為filter的集合是一個鏈,所以只會有處理的順序不同,而不會出現只選擇一個filter,所以它要攔截絕大部分請求,然後由每個匹配的filter進行自主處理。
這個解釋可能還有點不足,歡迎大家補充。