Servlet url-pattern 验证

配置完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

你可能感兴趣的:(Servlet url-pattern 验证)