servlet拥有一套特定的路径匹配规则:
按照优先级由高到低依次为:精确匹配、路径匹配、后缀匹配以及缺省匹配。一个请求只能命中一种匹配规则;
二者共同点:作用都是用于拦截http://ip:port/context下的所有请求
不同点:
-
/是路径匹配,可以匹配到任意的路径;而/仅仅是缺省匹配,仅当其他匹配都失效时才会生效,tomcat会提供一个默认的servlet即DefaultServlet来处理/请求。二者的区别就是/*会拦截所有请求,而/仅仅会拦截其他规则都失效的请求
-
在/模式下,servlet不会覆盖.jsp格式的请求,而/*可以拦截所有形式的请求;
-
在/*模式下,通过调用HttpServletRequest对象的getPathInfo()方法,将得到不包含context名称的访问路径;
在/模式下,该方法的返回值为null,只能使用gerRequestURI()等方法得到包含context名称的请求路径。
<servlet-mapping> <servlet-name>main</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>main</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
/*会覆盖其他servlets,无论任何请求都会请求执行该servlet
-
/不会覆盖其它servlet(它只会替换servlet容器中内置的静态资源和目录列表的默认servlet)。就是当请求没有匹配到一个更具体的URL时,会执行默认servlet。对于*.jsp,由于servlet容器中内置了jspServlet,所以不会被
/
拦截。
四种匹配规则:
1. 精确匹配
<url-pattern>中配置的项必须与url完全精确匹配。
<servlet-mapping> <servlet-name>servlet01</servlet-name> <url-pattern>/test/user</url-pattern> </servlet-mapping>
2. 扩展名匹配
以“*.”开头的字符串被用于扩展名匹配
<servlet-mapping> <servlet-name>servlet02</servlet-name> <url-pattern>*.htm</url-pattern> <url-pattern>*.do</url-pattern> </servlet-mapping>
3.路径匹配(先最长路径匹配,再最短路径匹配)
以“/”字符开头,并以“/*”结尾的字符串用于路径匹配
<servlet-mapping> <servlet-name>servlet03</servlet-name> <url-pattern>/user/*</url-pattern> <url-pattern>/*</url-pattern> </servlet-mapping>
4. 缺省匹配
<url-pattern>/</url-pattern>
找不到servlet时,会使用用默认的servlet