Servlet 中的 url-pattern

简介: 在 web.xml 中 < servlet-mapping >和< filter-mapping >都有< url-pattern >配置项它们的作用都是匹配一次请求是否会执行这个 Servlet 或 Filter,那么这个 URL 是怎么匹配的,又是何时匹配的呢?先看看 Servlet 是何时匹配的。

web.xml< servlet-mapping >< filter-mapping >都有< url-pattern >配置项
它们的作用都是匹配一次请求是否会执行这个 Servlet 或 Filter,那么这个 URL 是怎么匹配的,又是何时匹配的呢?

先看看 Servlet 是何时匹配的。在 4 文中介绍了一个请求最终被分配到一个 Servlet 中是通过 org.apache.tomcat.util.http.Mapper 类完成的,此类会根据请求的 URL 匹配在每个 Servlet 中配置的< url-pattern >,所以它在一个请求被创建时就已经匹配了.

Filter 的 url-pattern 匹配是在创建 ApplicationFilterChain 对象时进行的,它会把所有定义的 Filter 的 url-pattern 与当前的 URL 匹配,若匹配成功就将这个 Filter 保存到ApplicationFilterChainfilters 数组中,然后在 FilterChain 中依次调用

web.xml 加载时,会首先检查< url-pattern >配置是否符合规则,这个检查是在 StandardContextvalidateURLPattern 方法中检查的,若检查不成功,Context容器启动会失败,并且会报 java.lang.IllegalArgumentException:Invalid< url-pattern > /a/.htm in Servletmapping*异常

< url-pattern>的解析规则,对 Servlet 和 Filter 是一样的,匹配的规则有如下三种

  • 精确匹配:如/foo.htm 只会匹配 foo.htm 这个 URL
  • 路径匹配:如/foo/*会匹配以 foo 为前缀的 URL
  • 后缀匹配:如*.htm 会匹配所有以.htm 为后缀的 URL

Servlet 的匹配规则在 org.apache.tomcat.util.http.mapper.Mapper.internalMapWrapper 中定义,对 Servlet 的匹配来说如果同时定义了多个< url-pattern >,那么到底匹配那个 Servlet呢?

  • 首先精确匹配,
    如定义了两个 Servlet Servlet1 为/foo.htm,Servlet2是/*,请求 URL 为http://localhost/foo.htm,那么只有 Servlet1 匹配成功
  • 如果精确匹配不成功,那么会使用第二个原则“最长路径匹配”,
    如 Servlet1 为/foo/,Servlet2 为/,这时请求的 URL 为http://localhost/foo/foo.htm,那么 Servlet1 匹配成功;
  • 最后根据后缀进行匹配,但是一次请求只会成功匹配到一个 Servlet
目录
相关文章
|
5月前
|
前端开发 JavaScript Java
Web.xml - Servlet与Filter的url-pattern
Web.xml - Servlet与Filter的url-pattern
64 8
|
前端开发 Java 容器
Servlet的url-pattern配置
Servlet的url-pattern配置一定是精确的严谨的
|
容器 前端开发 JavaScript
|
应用服务中间件 容器
Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
http://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html#springmvc
1126 0
|
XML Java 应用服务中间件
|
容器 开发框架
转:Servlet的url匹配以及url-pattern详解
      Servlet是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet中的url-pattern还是有一些文章在里面的,总结了一些东西,放出来供大家参考,以免遇到问题又要浪费时间。
820 0
|
7天前
|
Java
学院管理系统【JSP+Servlet+JavaBean】(Java课设)
学院管理系统【JSP+Servlet+JavaBean】(Java课设)
26 3
学院管理系统【JSP+Servlet+JavaBean】(Java课设)
|
7天前
|
Java
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
23 0
|
7天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
20 5
|
7天前
|
Java
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
16 1