在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>
访问结果: