在servlet路徑映射中,關於url-pattern的配置有三種,分別是完全路徑匹配、目錄匹配、擴展名匹配
其優先級分別為:完全路徑匹配>目錄匹配>擴展名匹配;
一、三種路徑印射的區別
在服務器段的java代碼是:
package servlet0917;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class servlet01 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget方法被調用");
}
}
1、完全路徑代碼:
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/servlet/servlet01</url-pattern>
</servlet-mapping>
訪問結果:
訪問路徑:http://localhost:8080/servlet/servlet01

這種模式也叫完全模式匹配。
2、目錄匹配也叫通配符匹配
(1、)web端代碼:
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
訪問路徑可以有多個選擇:如下圖



當servlet中的路徑映射為<url-pattern>/servlet/*</url-pattern>,從字面意思也可以理解出servlet后面跟的是一個整目錄,目錄可以隨意訪問的。
(2)既url路徑中直接是/*
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
其訪問路徑沒有限制,訪問路徑可以是任何字符與數字,這里就不向大家一一展示了。
3、后綴名匹配,不能以/開頭,要以*開頭,比如 *.do
web端代碼:
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在訪問路徑時,其*可以換成任何字符與數字:如下圖所示



二:印射路之間的優先級
先定義兩個servlet文件,如圖所示,這里就不像大家展示其代碼了


1、web端代碼:比較/abc/*與/*的優先級,結論:如果同樣目錄匹配,限定范圍越緊准,越先被匹配
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/abc/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>servlet0917.servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
2、端口代碼:/abc/*與/abc比較,先被訪問的是完全路徑匹配,其次才是目錄匹配(ps:目錄匹配大多都帶有*)
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/abc/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>servlet0917.servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>/abc</url-pattern>
</servlet-mapping>
訪問結果:

3、用目錄路徑/abc/*與擴展名*.do訪問,結果是目錄路徑先被訪問
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/abc/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>servlet0917.servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>*.do</url-pattern>d
</servlet-mapping>
訪問結果:

4、web端代碼:/*與*.do,先被訪問的還是目錄路徑,
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>servlet0917.servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>servlet0917.servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>*.do</url-pattern>d
</servlet-mapping>
訪問結果:

