【问题标题】:Mapping cases in web.xml在 web.xml 中映射案例
【发布时间】:2015-05-31 20:05:38
【问题描述】:

web.xml 中,是否可以将主映射和第二个映射用于不同于第一个映射的映射,如下所示?

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ErrorHandler</servlet-name>
    <url-pattern>/?</url-pattern>
</servlet-mapping>

【问题讨论】:

  • Wicpar,感谢编辑

标签: java xml web-applications web.xml url-mapping


【解决方案1】:

一个部署描述符中可以有多个servlet-mappings。选择映射的规则在Java Servlet Specification 第 12 章中描述。将请求映射到 Servlet:

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

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

所以这意味着,如果您有像&lt;url-pattern&gt;/tar&lt;/url-pattern&gt; 这样的完全匹配,则将选择此映射。否则将使用第二个不太具体的映射(例如&lt;url-pattern&gt;/*&lt;/url-pattern&gt;)。

但是您不能使用&lt;url-pattern&gt;/tar*&lt;/url-pattern&gt; 创建映射,因为星号只允许在模式的末尾/* 或开头*.(注意斜线/之前和星号之后的句点.)。有关完整详细信息,请参阅第 12.2 节映射规范。

【讨论】:

  • 这个想法是我们确切地知道第一个映射,例如/tar,但我们不知道其他可能的映射/targe/targ 等等......所以第二个 Servlet 应该处理所有不同于/tar 模式的映射。
猜你喜欢
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2010-11-16
  • 2013-12-06
  • 2013-09-24
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多