Servlet容器的URL匹配过程
- 发送请求url:http://localhost/test/abc
- Servlet容器将请求的url减去当前应用上下文的路径作为其url,也就去去掉http://localhost/test,剩下/abc用来作路径匹配。
- 按照一定的匹配规则,只要有一个servlet匹配成功,就不会去理会其他的servlet(当然,filter是不同的)
url-pattern详解
- 路径映射:以”/’开头和以”/*”结尾
- 拓展映射:以前缀”*.”开头
- default servlet:"/"
- 精确映射:完全的url路径
匹配规则
Servlet共有四大匹配规则,
-
精确路径匹配
比如URL为http://localhost/test/abc,去掉上下文路径为/abc,如果 servletA 的url-pattern为 /abc,servletB的url-pattern为 /*,servletA完全匹配,则其他servlet不会再匹配
-
最长路径匹配(跟同类相比的最长)
如上URL,没有上下文路径,如果 servletA 的url-pattern为 /test/*,servletB的url-pattern为 /test/abc/*,根据最长路径,此时选择servletB
但是,如果servletC的url-pattern为/test/abc,那么会选择servletC,完全匹配
-
扩展匹配
如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。如:servletA的url-pattern:*.action
-
默认匹配
如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet,default servlet的url-pattern为"/"
filter与url-pattern
对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同
一个特例
/*.action会被tomcat认为是错误的匹配,因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
网友评论