【问题标题】:What happens if I have two servlet mappings in web.xml that match a request?如果 web.xml 中有两个匹配请求的 servlet 映射会发生什么?
【发布时间】:2012-08-06 01:29:30
【问题描述】:

如果我在 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>

【问题讨论】:

  • /* 上有一个servlet 是一种奇怪的设计。也许它实际上应该是一个过滤器?

标签: java web-applications servlets


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2015-03-01
    • 2013-01-20
    • 2017-03-24
    • 2012-04-17
    • 2012-07-23
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多