servlet的url-pattern匹配规则简介

servlet的url-pattern匹配规则简介前言 正在看 SpringMVC 的前端控制器 正好看到了一个 lt url pattern gt lt url pattern gt 由此引发对 url pattern 匹配规则的思考 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 第一章匹配概述 lt url pattern gt 是我们用 Servlet 做 Web 项目时需要经常配置的标签 例 lt

前言:正在看SpringMVC的前端控制器,正好看到了一个

/
,由此引发对url-pattern匹配规则的思考。

                                       第一章 匹配概述


是我们用Servlet做Web项目时需要经常配置的标签,例:

 
   
   
     index 
    
   
     com.we.servlet.IndexServlet 
    
   
   
   
     index 
    
   
     /index 
    
   

当我们在浏览器的地址栏里输入http://localhost:8080/we/index时(假设我部署在webapps目录下的项目名为we)

就会匹配到我们指定的

中,即/index然后一步一步找到对应的

那我们输入的URL:http://localhost:8080/we/index又是如何与

中的/index匹配的呢?

首先我们要知道URL的组成

http://localhost:8080    我们可以理解为是我们的服务器地址,而该地址之后的部分我们统称为:RequestURI

RequestURI是我们需要重点注意的部分,其又可以分解为几部分

/we  是我们的ServletConext的上下文地址,我们称为ServletContext Path,可以简单理解为部署项目时的webapps目录下的项目名

/index  是我们的Servlet的地址,我们称为Servlet Path,这里就是需要与我们的

匹配的内容

在利用servlet或Filter进行url请求的匹配时,很关键的一点就是匹配规则,但servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是由自己的规则,比较容易混淆。

这个映射匹配过程是有优先顺序的(具体的优先顺序规则后面介绍),而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了

Filter的匹配规则与servlet一样,但对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。

                                         第二章 匹配规则

2.1 精准匹配


中配置的项必须与url完全精确匹配。

如配置信息如下:

 
   
   
     MyServlet 
    
   
     /kata/detail.html 
    
   
     /demo.html 
    
   
     /table 
    
  

注意:

http://10.43.11.143/myapp/table/ 是非法的url,不会被当作http://10.43.11.143/myapp/table识别

另外上述url后面可以跟任意的查询条件,都会被匹配,如

http://10.43.11.143/myapp/table?hello 这个请求就会被匹配到MyServlet。

 

2.2 扩展名匹配

匹配规则如下:

 
   
   
     MyServlet 
    
   
     *.jsp 
    
  

2.3 路径匹配

匹配规则如下:

 
   
   
     MyServlet 
    
   
     /kata/* 
    
  

http://10.43.11.143/myapp/kata/action

http://10.43.11.143/myapp/kata/action/

注意:路径和扩展名匹配无法同时设置,比如下面的三个

都是非法的,如果设置,启动tomcat服务器会报错。


/kata/*.jsp


/*.jsp


he*.jsp

另外注意:

/aa/*/bb

这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义

2.4 匹配任意的url

如果

配置成如下两种的任意一种


/


/*

则所有的url都可以被匹配上。其中/*是路径匹配,只是路径就是/。

以上两种是有区别的,内容较多较重要,放在第三章细说。

2.5 优先顺序

当一个url与多个servlet的匹配规则可以匹配时,则按照 “ 精确路径 > 最长路径>扩展名”这样的优先级匹配到对应的servlet。举例如下:

例1:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。

例2:比如servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。 

例3: 比如servletA的url-pattern:*.action ,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB。

第三章 

/


/*
的区别


/
 看官方文档可知,果我们的项目中配置了”/”,会覆盖掉tomcat中的默认servlet,当其他的url-pattern匹配不上时都会走这个servlet,它会匹配到后缀型url,它除了能够处理静态资源如“.js”,“.css”,”.png”等,还能够处理HTTP缓存请求,媒体(音频/视频)数据流和文件下载简历。说到为什么JSP页面的请求(*.jsp)并不会命中这个servlet,那是因为当有这种url请求时,servlet容器内建的JSP servlet将会被调用,而这个容器内建的JSP servlet已经默认地映射在了*.jsp上。 


/*

这种形式将会覆盖所有其它的servlet。不管你发出了什么样的请求,最终都会在这个servlet中结束。因此,对于servlet来说,这是一个很糟糕的URL模式。通常来讲,你只会想要在一个Filter中使用这种模式。它可以通过调用doFilter()方法来使请求继续。 

参考博客:

https://www.cnblogs.com/huangwentian/p/6417792.html   

https://www.cnblogs.com/51kata/p/5152400.html

https://blog.csdn.net/_/article/details/

https://blog.csdn.net/u0/article/details/

可能有用的英文解释:http://stackoverflow.com/questions//difference-between-and-in-servlet-mapping-url-pattern 

servlet的url-pattern匹配规则简介

注:本人的这篇文章大部分是从上面几篇中拿了感觉比较好的部分复制粘贴的,进行了自我归纳和整理,非常感谢,如有侵权,请私聊,我会删除(逃)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218412.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:19
下一篇 2026年3月18日 上午7:19


相关推荐

  • 每天一道算法_9_由后序遍历和中序遍历求前序遍历

    假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,求前序遍历。 整体思路是这样的,由后序遍历找到每个节点,然后由中序遍历判断左右子树,将整个二叉树还原后写出前序遍历。后序遍历的顺序知道,最后一个A是二叉树的根节点,然后把中序遍历从A分成两段,A左边的是左子树,A右边的是右子树,结果如下 然后看右边的子树,从后序遍

    2022年3月11日
    52
  • SpringCloud(八)—-OpenFeign通讯优化

    SpringCloud(八)—-OpenFeign通讯优化

    2020年11月12日
    304
  • 阵列信号DOA估计系列(三).MVDR/Capon波束形成(附代码)

    阵列信号DOA估计系列(三).MVDR/Capon波束形成(附代码)本文主要介绍Capn波束形成算法,又名最小方差无失真相应(MinimumVarianceDistortionlessResponse,MVDR),并将其方法应用于DOA估计。

    2022年6月26日
    36
  • java操作SFTP

    java操作SFTP引言最近项目中对接了几个将客户 在案件传输的时候都采用 SFTP excel 或者 csv 的方式传输 下面分享一下小编在项目中对 sftp 操作的封装的工具类 同时分享一下在实际中的应用 1 相关包依赖 dependency groupId org apache sshd groupId lt dependency

    2026年3月26日
    2
  • CSS 都有哪些选择器?

    CSS 都有哪些选择器?CSS 都有哪些选择器 1 标签选择器 如 body div p ul li 2 类选择器 如 class head class head logo 3 ID 选择器 如 id name id name txt 4 全局选择器 如 号 5 组合选择器 如 head head logo 注意两选择器用空格键分开 6 继承选择器 如 divp 注意两选择

    2026年3月17日
    3
  • Android json字符串转Map

    Android json字符串转Map今天,同事问我json的问题。遍历json数组,解决完以后。我想到了json转Map这个问题。写一下,发现效果还行那个发上来看看吧。如果想省事的话,用阿里的FastJson我感觉也是不错的,网上教程很多,我就不多说了。注意这是Android自带的json包importorg.json.JSONArray;importorg.json.JSONException;importo…

    2022年6月21日
    230

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号