<url-pattern>是咱們用Servlet作Web項目時須要常常配置的標籤,例:css
<servlet>
<servlet-name>index</servlet-name>
<servlet-class>com.we.servlet.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>index</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>html
當咱們在瀏覽器的地址欄裏輸入http://localhost:8080/we/index時[假設我部署在webapps目錄下的項目名爲we]web
就會匹配到咱們指定的<url-pattern>中,即/index而後一步一步找到對應的<servlet-class>瀏覽器
那咱們輸入的URL:http://localhost:8080/we/index又是如何與<url-pattern>中的/index匹配的呢?服務器
首先咱們要知道URL的組成app
http://localhost:8080 咱們能夠理解爲是咱們的服務器地址,而該地址以後的部分咱們統稱爲:RequestURIwebapp
RequestURI是咱們須要重點注意的部分,其又能夠分解爲幾部分jsp
/we 是咱們的ServletConext的上下文地址,咱們稱爲ServletContext Path,能夠簡單理解爲部署項目時的webapps目錄下的項目名url
/index 是咱們的Servlet的地址,咱們稱爲Servlet Path,這裏就是須要與咱們的<url-pattern>匹配的內容spa
注:在/index後邊咱們還能夠跟其餘的信息,例如:/index?name=admin&pass=admin 這是其中一種明文表示的方式
咱們知道在寫<url-pattern>時有一種通配符的使用寫法,即*
1.當我使用<url-pattern>/*</url-pattern>時,咱們能夠匹配全部的請求,即全部的請求都會通過該標籤對應的Servlet
此時就須要注意靜態資源的請求,由於當咱們使用http://localhost:8080/we/login.html時,依然會匹配該Servlet,
而不少靜態資源實際上是不須要通過Servlet的,例如:js,css,html,jsp,img等靜態資源文件,此時就須要在該Servlet中對靜態資源作特殊處理
2.若是配有以下兩個<url-pattern>標籤時,URL地址爲http://localhost:8080/we/index時又是如何匹配的呢?
<url-pattern>/index</url-pattern>
<url-pattern>/*</url-pattern>
上邊咱們已經說過,/*能夠匹配全部的請求,而/index也能夠匹配咱們的URL地址,此時URL地址會自動且優先的進行精確匹配,即/index,
且只匹配一次,也就是說一旦匹配到一個Servlet即執行該Servlet再也不對其餘Servlet進行匹配,
當咱們輸入一個http://localhost:8080/we/login時,因爲此時匹配不到/login因此只能匹配/*了
3.在Servlet Path部分咱們還可使用更精確的匹配,例如:
<url-pattern>/index/login</url-pattern>匹配http://localhost:8080/we/index/login
<url-pattern>/index/logout</url-pattern>匹配http://localhost:8080/we/index/logout
此時/index/login和/index/logout纔是咱們的Servlet Path
4.咱們能夠經過使用<url-pattern>*.do</url-pattern>來過濾請求,
這樣若是咱們在頁面中的請求中添加後綴名.do就能夠避免對靜態資源的過濾了,也就不須要對靜態資源作特殊處理了
注:<url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>效果是同樣的