Servlet url-pattern 验证
博客专区 > ayesd 的博客 > 博客详情
Servlet url-pattern 验证
ayesd 发表于4年前
Servlet url-pattern 验证
  • 发表于 4年前
  • 阅读 2644
  • 收藏 2
  • 点赞 1
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 网上很多搜索servlet 顺序,出来的大多数文章讲的都是tomcat加载顺序,即:context-param -> listener -> filter -> servlet,而讲到对于某类配置节而言,与它们出现的顺序是有关的,后面觉得例子就是filter,顺便提出servlet和filter一样,而实际上,不是!

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

共有 人打赏支持
粉丝 4
博文 19
码字总数 30025
×
ayesd
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: