理論--- 匹配規則

開始:


在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時,都會被匹配到該servlet
http://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的匹配規則,總的來說就是分爲 精確,路徑和擴展名三種匹配方式,並且介紹了優先級





 

java web中servlet、jsp、html 互相訪問的路徑問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章