基礎7——url-pattern匹配規則


首先需要明確幾容易混淆的規則:

1.servlet容器中的匹配規則既不是簡單的通配,也不是正則表達式,而是特定的規則。所以不要用通配符或者正則表達式的匹配規則來看待servlet的url-pattern。

2.Servlet 2.5開始,一個servlet可以使用多個url-pattern規則,<servlet-mapping>標簽聲明了與該servlet相應的匹配規則,每個<url-pattern>標簽代表1個匹配規則;

3.當servlet容器接收到瀏覽器發起的一個url請求后,容器會用url減去當前應用的上下文路徑,以剩余的字符串作為servlet映射,假如url是http://localhost:8080/appDemo/index.html,其應用上下文是appDemo,容器會將http://localhost:8080/appDemo去掉,用剩下的/index.html部分拿來做servlet的映射匹配

4.url-pattern映射匹配過程是有優先順序的,而且當有一個servlet匹配成功以后,就不會去理會剩下的servlet了。

說明:

1、不能將兩個Servlet映射到同一個url-pattern,Tomcat會報錯;

2、 <servlet-mapping>

<servlet-name>HelloServlet</servlet-name>

<url-pattern>/user/hi</url-pattern>

</servlet-mapping>

與:

 <servlet-mapping>

<servlet-name>HelloServlet</servlet-name>

<url-pattern>/user/*</url-pattern>

</servlet-mapping>

如果URL為http://localhost:8080/demo/user/hi 優先精確匹配,即匹配HelloServlet

 

 

一、四種匹配規則

1 精確匹配

  <url-pattern>中配置的項必須與url完全精確匹配。

注:<url-pattern>/user/*/hi</url-pattern> 這里的*不是通配符,是精確匹配

2 擴展名匹配

  以“*.”開頭的字符串被用於擴展名匹配

注:<url-pattern>/user/*.html</url-pattern> 錯誤,會產生IllegalArgumentException

3 路徑匹配

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

注:<url-pattern>/user/*/hi</url-pattern> 這里不是路徑匹配,是精確匹配

4 缺省匹配

<url-pattern>/</url-pattern>

 

 

二、匹配順序

1 精確匹配

2 路徑匹配,先最長路徑匹配,再最短路徑匹配

3 擴展名匹配

4 缺省匹配,以上都找不到servlet,就用默認的servlet,配置為<url-pattern>/</url-pattern>

 

 

 

三、需要注意的問題

1 路徑匹配和擴展名匹配無法同時設置

  匹配方法只有三種,要么是路徑匹配(以“/”字符開頭,並以“/*”結尾),要么是擴展名匹配(以“*.”開頭),要么是精確匹配,三種匹配方法不能進行組合,不要想當然使用通配符或正則規則。

  如<url-pattern>/user/*.action</url-pattern>是非法的

  另外注意:<url-pattern>/aa/*/bb</url-pattern>是精確匹配,合法,這里的*不是通配的含義

2 "/*"和"/"含義並不相同

l  “/*”屬於路徑匹配,並且可以匹配所有request,由於路徑匹配的優先級僅次於精確匹配,所以“/*”會覆蓋所有的擴展名匹配,很多404錯誤均由此引起,所以這是一種特別惡劣的匹配模式,一般只用於filter的url-pattern

l  “/”是servlet中特殊的匹配模式,切該模式有且僅有一個實例,優先級最低,不會覆蓋其他任何url-pattern,只是會替換servlet容器的內建default servlet ,該模式同樣會匹配所有request。

l  配置“/”后,一種可能的現象是myServlet會攔截諸如http://localhost:8080/appDemo/user/addUser.action、http://localhost:8080/appDemo/user/updateUser的格式的請求,但是並不會攔截http://localhost:8080/appDemo/user/users.jsp、http://localhost:8080/appDemo/index.jsp,這是應為servlet容器有內置的“*.jsp”匹配器,而擴展名匹配的優先級高於缺省匹配,所以才會有上述現象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM