標簽<url-pattern>
<url-pattern>是我們用Servlet做Web項目時需要經常配置的標簽,例:
<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>
當我們在瀏覽器的地址欄里輸入http://localhost:8080/we/index時[假設我部署在webapps目錄下的項目名為we]
就會匹配到我們指定的<url-pattern>中,即/index然后一步一步找到對應的<servlet-class>
那我們輸入的URL:http://localhost:8080/we/index又是如何與<url-pattern>中的/index匹配的呢?
首先我們要知道URL的組成
http://localhost:8080 我們可以理解為是我們的服務器地址,而該地址之后的部分我們統稱為:RequestURI
RequestURI是我們需要重點注意的部分,其又可以分解為幾部分
/we 是我們的ServletConext的上下文地址,我們稱為ServletContext Path,可以簡單理解為部署項目時的webapps目錄下的項目名
/index 是我們的Servlet的地址,我們稱為Servlet Path,這里就是需要與我們的<url-pattern>匹配的內容
注:在/index后邊我們還可以跟其他的信息,例如:/index?name=admin&pass=admin 這是其中一種明文表示的方式
標簽<url-pattern>中*的使用
我們知道在寫<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>效果是一樣的