一,servlet容器对url的匹配过程:

当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:

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

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

3.     扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

4.     如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。

根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。

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

在web.xml文件中,以下语法用于定义映射:

l 以”/’开头和以”/*”结尾的是用来做路径映射的。

l 以前缀”*.”开头的是用来做扩展映射的。

l “/” 是用来定义default servlet映射的。

l 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action

所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

最新文章

  1. dos下对mysql的简单操作(linux类似)
  2. (转)解决Mac OS X上PhpStorm不能输入中文
  3. android viewPager 切换页面时防止fragment重新加载
  4. 西川善司【神秘海域(Uncharted)】的图形分析
  5. [Android] hid设备按键流程简述
  6. conda创建py27虚拟环境安装theano(anaconda3)
  7. 2018世界气象日,API为气象助力
  8. Unity UGUI之Canvas&EventSystem
  9. 洛谷 P2725 解题报告
  10. 使用loadrunner编写webservice接口请求
  11. eclipse 部署项目
  12. JS学习笔记Day4
  13. windows server 修改远程桌面连接端口号
  14. Javascript 高级程序设计--总结【二】
  15. ThinkPHP框架 祖辈分的理解 【儿子 FenyeController】继承了【父亲 FuController】继承了【祖辈 Controller】的
  16. [ Learning ] Spring Resources
  17. Spring源码解析二:IOC容器初始化过程详解
  18. Lucene学习——IKAnalyzer中文分词
  19. 【React Native开发】React Native For Android环境配置以及第一个实例(1)
  20. 1112 Stucked Keyboard (20 分)

热门文章

  1. Laravel使用ORM操作数据
  2. php 正则匹配省市区
  3. Git安装部署
  4. Android无线测试之—UiAutomator UiSelector API介绍之八
  5. HDU1688(Sightseeing)
  6. 关于angularjs的orderby排序
  7. js特殊字符过滤
  8. 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)
  9. Jquery添加元素append及阻止表单提交submit
  10. Js前台页面搜索