个人博客 www.ylhwan.com
URL匹配规则有如下几种:
(1)精准匹配
中的配置项必须与URL完全精确匹配
当在浏览器中输入如下几种URL,都会被匹配到该Servlet,具体代码如下
http://localhost/ay
http://localhost/index.html
http://localhost/test/ay.html
(2)拓展名匹配
以"*"开头的字符串被用于拓展名匹配
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<!-- 扩展名匹配 -->
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
当在浏览器输入如下几种URL时,都会被匹配到该Servlet,具体代码如下:
http://localhost/ay.jsp
http://localhost/al.jsp
(3)路径匹配
以"/“字符开头,并”/*"结尾的字符串用于路径匹配
当在浏览器中输入如下几种URL时,都会被匹配到该Servlet,具体代码如下:
http://localhost/ay/ay.jsp
http://localhost/ay/ay.html
http://localhost/ay/action
http://localhost/ay/xxxx
http://localhost/ay/xxxx.do
注:路径匹配和拓展名匹配无法同时设置,如果设置,启动tomcat服务器会报错。如下三种匹配规则是错误的:
<url-pattern>/kata/*.jsp</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>he*.jsp</url-pattern>
(4) 默认匹配
<servlet-mapping>
<servlet-name>spring-dispatcher</ servlet-name><!-- 默认匹配所有请求 -- >
<url-pattern>/</url-pattern>
</servlet-mapping>
(5)匹配顺序
当一个URL与多个Servlet的匹配规则可以匹配,则按照"精准路径>最长路径>扩展名"这样的优先级匹配到对应的Servlet。
例:
-
比如ServletA的url-pattern为/test, ServletB 的url-pattern为/*,如果访问的URL路径为http://localhost/test,容器会优先进行精确路径匹配,发现/test正好被ServletA精确匹配,那么就会去调用ServletA,而不是ServletB。
-
比如ServletA的url-pattern为/test/,而ServletB的url- pattern为/test/a/,如果访问的URL路径为http://localhosvtest/a,容器会选择路径最长的Servlet来匹配,也就是ServletB。
-
比如ServletA的url-pattern: * action,ServletB 的url-patterm为/*。如果访问的URL路径为htp://localhost/test.action,容器会优先进行路径匹配,而不是扩展名匹配,这样就去调用ServletB。