具有多个匹配项的 Servlet 映射

Servlet mapping with multiple matches

我有一个关于映射行为的问题。

如果给出了这些映射:

<servlet-mapping>
   <servlet-name> ServletA </servlet-name>
   <url-pattern> *.xml </url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name> ServletB </servlet-name>
   <url-pattern> /result/* </url-pattern>
</servlet-mapping>

还有这个 HTTP 请求:

/result/example.xml

将映射哪个 servlet,为什么?

根据您的 <servlet-mapping> 配置,/result/example.xml 的请求将由 ServletB 处理,因为路径匹配总是胜过扩展名匹配。

之所以如此,是因为与针对特定目录及其后代的路径匹配相比,扩展匹配被认为是更宽松的(不是失败者,尽管它也适用:) 约束,因为它适用于整个站点,并且因此在本质上更具体。

匹配优先级是这样的:

  1. 精确路径匹配
  2. 通配符路径匹配(较长的匹配比较短的匹配)
  3. 扩展匹配
  4. 默认 servlet(仅配置 / 来处理所有 404)