16

如果 web.xml 中有两个匹配请求的 servlet 映射会发生什么?它选择最具体的吗?

例如,如果我有以下 xml 并且请求来到 ..../something 而它转到 somethingservlet 或 Everything_else servlet?

   <servlet-mapping>
      <servlet-name>something</servlet-name>
      <url-pattern>/something</url-pattern>
  </servlet-mapping>    

  <servlet-mapping>
    <servlet-name>everything_else</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
4

1 回答 1

19

将使用第一个成功的匹配。

servlet 容器遵循一定的映射规则。阅读 Servlet 2.5 规范章节 SRV.11:

用于映射到 servlet 的路径是来自请求对象的请求 URL 减去上下文路径和路径参数。下面的 URL 路径映射规则按顺序使用。使用第一个成功的匹配,不再尝试匹配:

  1. 容器将尝试找到请求路径与 servlet 路径的完全匹配。成功的匹配选择 servlet。
  2. 容器将递归地尝试匹配最长的路径前缀。这是通过使用“/”字符作为路径分隔符一次将路径树下移一个目录来完成的。最长的匹配决定了选择的 servlet。
  3. 如果 URL 路径中的最后一段包含扩展名(例如 .jsp),则 servlet 容器将尝试匹配处理扩展请求的 servlet。扩展名被定义为最后一个'.'之后的最后一段的一部分。特点。
  4. 如果前三个规则都没有导致 servlet 匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了一个“默认”servlet,它将被使用。
于 2012-08-08T20:55:38.310 回答