Servlet url-pattern 验证

本文解析了Servlet的URL匹配机制,包括精确匹配与范围匹配的原则。通过实例说明了不同URL模式如何影响Servlet的调用顺序,并对比了filter与servlet在匹配上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://my.oschina.net/ayesd/blog/278336

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值