配置完servlet和servlet-mapping之后,启动服务,进行调试,结果和想象中的完全不一样,web.xml配置如下:
<servlet>
<servlet-name>RefreshPropeties</servlet-name>
<servlet-class>servlet.RefreshPropeties</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RefreshPropeties</servlet-name>
<url-pattern>/refresh</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MyDispatcherServlet</servlet-name>
<servlet-class>servlet.MyDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyDispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MyTestServetl</servlet-name>
<servlet-class>servlet.MyTestServetl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyTestServetl</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如果访问的是http://localhost/list.do,实际上只调用了“MyDispatcherServlet“,另外一个根本没有调用,也有人可能说,是因为放置的顺序问题,我们交换下下面两个servlet顺序,发现结果还是一样!
如果访问的是http://localhost/refresh,结果是,只调用了RefreshPropeties。
这是为什么呢?
经过检验,发现,对于Servlet 的url匹配是基于这样的原则和顺序:
1、精确匹配,如第二个地址,如果能够找到,则直接调用servlet;
2、如果不能精确匹配,而且还有好几个匹配项,则选择匹配项中范围更大的那个,例如上面的例子中/*范围肯定比*.do的范围大,因此,不管两个servlet顺序如何,都将调用“MyDispatcherServlet“。
3、如果不能精确匹配,而且匹配项范围一致,则顺序在前面的被调用,测试的话可以将“MyDispatcherServlet“的url-pattern修改为*.do,再次调用地址http://localhost/list.do,则发现在前面配置的servlet将会被调用!
解释:
对于filter来说,只要匹配,都会被调用,因为filter是一个链,会根据配置顺序逐步调用
对于servlet来说,每次只会掉用一个,因为对于一个请求,如果有两个servlet去处理,那么客户端会接收到两个response吗?
因此,对于filter来说,网上讲解的没有问题,对于servlet来说,可能需要仔细斟酌了,不能以” servlet 同 filter 类似 ,此处不再赘述。“来回避了!
由此看来,自己的基础水平还有待提升哈!
果然和这个问题有缘分,今天找到一个博客也是解说此问题的,不过是从源码的角度来进行分析,比我的详细和专业,像博主致敬!地址:http://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html#springmvc