web.xml配置 關於web.xml配置中的<url-pattern>
- 2019 年 10 月 10 日
- 筆記
web.xml文件的繼承
在${CATALINA_HOME}confweb.xml中的內容,相當於寫到了每個項目的web.xml中,它是所有web.xml的父文件。
每個完整的JavaWeb應用中都需要有web.xml,但我們不知道所有的web.xml文件都有一個共同的父文件,它在Tomcat的conf/web.xml路徑。
conf/web.xml
|
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>default[c1] </servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet[崔2] </servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern>[崔3] </servlet-mapping> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern>[崔4] <url-pattern>*.jspx</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout>[崔5] </session-config> <!– 這裡省略了大概4000多行的MIME類型的定義,這裡只給出兩種MIME類型的定義 –> <mime-mapping> <extension>bmp</extension> <mime-type>image/bmp</mime-type> </mime-mapping> <mime-mapping> <extension>htm</extension> <mime-type>text/html</mime-type> </mime-mapping>[崔6] <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>[崔7] </web-app> |
|---|
[c1]它的優先級最低,如果一個請求沒有人處理,那麼它來處理!它顯示404。
[崔2]當訪問路徑不存在時,會執行該Servlet!其實我們在訪問index.html時也是在執行這個Servlet。
[崔3]匹配所有URL,也就是說用戶訪問的URL路徑沒有匹配的頁面時,那麼執行的就是名為default的Servlet,即org.apache.catalina.servlets.DefaultServlet
[崔4]任何URL後綴為jsp的訪問,都會執行名為jsp的Servlet,即org.apache.jasper.servlet.JspServlet
[崔5]session的默認超時時間為30分鐘,後面講session時再深入。
[崔6]MIME類型用來標識網絡上資源的媒體類型,這裡舉例為bmp和html兩種MIME類型。
[崔7]在應用的web.xml中如果沒有對<welcome-file-list>進行覆蓋,那麼默認主頁為index.html、index.html、index.jsp
關於web.xml配置中的<url-pattern>
另一套講解 https://www.cnblogs.com/51kata/p/5152400.html
標籤<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>效果是一樣的
