開始:
在web應用部署描述符中,用於映射的語法規定如下:
①以"/"字符開頭,並以"/*"結尾的字符串用於路徑映射
②以"*"開頭的字符串被用於擴展名映射
③空字符串("")(?"" 和" "相等嗎 ?)是用於指定精確映射應用程序 context root 的URL 模式,比如從 http://host:port/<contextroot>/來的請求。
④字符串中僅有"/"字符時,表示應用程序"默認"的servlet。
在這種情況下servlet路徑是請求url去掉context路徑,
⑤其他的字符串僅用於精確匹配
<url-pattern>的三種寫法
1.精確匹配。以"/"開頭,加上servlet名稱
◇/desc
2.路徑匹配。以"/"開頭,加上通配符"*"。
◇/*
3.擴展名匹配。以通配符"*"開頭,加上擴展名
◇*。action
在利用servlet或filter進行url請求的匹配時,
很關鍵的一點是匹配規則,
但是servlet容器中的匹配規則既不是簡單的通配
也不是正則表達式
而是有自己的規則
比較容易混淆
●絕對路徑和相對路徑
當瀏覽器發起一個url請求後,該請求發送到servlet容器的時候,
容器會先將請求的url減去當前應用上下文的路徑作爲servlet的映射url,
比如url是
http://localhost:8080/myapp/demo/detail.jsp
其應用上下文是myapp,容器會將http://localhost:8080/myapp去掉,剩下的/demo/detail.html部分拿來做servlet的映射匹配
這個映射過程是有優先順序的(具體的優先順序規則後面介紹)
而且當有一個servelt匹配成功以後,就不會去理會剩下的servlet了
Filter的匹配規則和servlet一樣,但對於filter,不會像servlet那樣只匹配一個servlet
因爲fileter的集合是一個鏈,所以只會有處理的順序不同,而不會出現只選擇一個filter
Filter的處理順序和filter-mapping在web.xml中定義的順序相同
下面介紹各種匹配規則
一.精確匹配
<url-pattern>中的配置的項必須與url完全精確匹配
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/kata/detail.html</url-pattern>
<url-pattern>/demo.html</url-pattern>
<url-pattern>/table</url-pattern>
</servlet-mapping>
當在瀏覽器中輸入如下幾種url時,都會被匹配到該servlethttp://10.43.11.143/myapp/kata/detail.html
http://10.43.11.143/myapp/demo.html
http://10.43.11.143/myapp/table
注意:
http://localhost:8080/myapp/demo/是非法的url,不會被當作
http://localhost:8080/myapp/demo識別
上述url後面跟任意的查詢條件,都會被匹配,如
http://localhost:8080/myapp/demo?hello?xxx 這個請求就會被匹配到MyServlet
二.擴展名匹配
匹配規則如下
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
則任何擴展名爲 jsp(文件名和路徑任意)的url請求都會匹配,
比如下面的url都會被匹配
http://localhost:8080/myapp/demo/demo.jsp
http://localhost:8080/myapp/demo/test.jsp
三.路徑匹配
如果匹配規則如下
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/demo/*</url-pattern>
</servlet-mapping>
則請求的url只要前面(myapp之後)的路徑是/demo,而後面的路徑可以任意
比如下面的url都會被匹配
http://localhost:8080/myapp/demo/demo.html
http://localhost:8080/myapp/demo/test.jsp
http://localhost:8080/myapp/demo/test/detail.html
http://localhost:8080/myapp/demo/action
http://localhost:8080/myapp/demo/action/
注意:路徑和擴展名匹配無法通時設置,比如下面的三個<url-pattern>都是非法的,如果設置,啓動tomcat服務器會報錯
四,匹配任意的url
如果<url-pattern>配置成如下兩種的任意一種
<url-pattern>/</url-pattern>
<url-pattern>/*</url-pattern>
則所有的url都可以被匹配上。其中/*是路徑匹配,只是路徑就是/。五,優先順序:
當一個url與多個servlet的匹配規則可以匹配時,則按照"精確路徑>最長路徑>擴展名"這樣的優先級匹配到對應的servlet
舉例如下:
總結: 本文介紹了servlet的匹配規則,總的來說就是分爲 精確,路徑和擴展名三種匹配方式,並且介紹了優先級