首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能解释一下servlet映射吗?

有人能解释一下servlet映射吗?
EN

Stack Overflow用户
提问于 2008-10-24 16:16:54
回答 3查看 80.2K关注 0票数 51

我正在尝试使用SpringMVC编写web应用程序。通常,我只是将一些虚构的文件扩展名映射到Spring的前端控制器上,并快乐地生活着,但这一次我将使用类似REST的URL,没有文件扩展名。

将上下文路径下的所有内容映射到前端控制器(我们称其为“tomcat应用程序”)意味着我也应该处理静态文件,这是我不愿意做的事情(为什么要重新发明另一个weel呢?),因此与tomcat的默认servlet (我们称之为"tomcat")的某种组合似乎是可行的。

我做了一些像这样的事情

代码语言:javascript
复制
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

并对我的静态内容的每个文件扩展名重复后者。我只是想知道为什么下面的设置,对我来说等同于上面的设置,不起作用。

代码语言:javascript
复制
<!-- failed attempt #1 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

<!-- failed attempt #2 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

有没有人能说点什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-28 22:36:30

我想我可能知道是怎么回事了。

在您的工作web.xml中,您已经将您的servlet设置为默认的servlet (如果没有其他匹配,则/本身就是调用的默认servlet ),它将响应任何与另一个映射不匹配的请求。

在失败的1中,您的/*映射似乎确实是有效的路径映射。使用web.xml中的/*映射,它会响应除其他路径映射之外的所有请求。根据规范,扩展映射是被显式映射覆盖的隐式映射。这就是扩展映射失败的原因。所有内容都显式地映射到app。

在失败2中,App负责所有内容,除了与静态内容映射匹配的内容。以显示在我设置的快速测试中发生了什么。下面是一个例子。/some-static-content-folder/包含test.png

尝试访问我尝试过的test.png:

代码语言:javascript
复制
/some-static-content-folder/test.png

并且没有找到该文件。无论如何尝试

代码语言:javascript
复制
/some-static-content-folder/some-static-content-folder/test.png

它就会出现。因此,看起来Tomcat默认servlet (至少是6.0.16)删除了servlet映射,并将尝试使用剩余的路径查找文件。根据这篇文章,Servlet for serving static content Jetty给出了你和我所期望的行为。

有没有什么原因你不能为你的rest调用映射根目录。像app映射到/ rest_root /*这样的东西,你可以对rest_root文件夹中发生的任何事情负责,但是任何其他地方都应该由Tomcat处理,除非你做了另一个显式的映射。我建议将rest servlet设置为路径映射,因为它更好地声明了意图。使用/或/*似乎并不合适,因为您必须绘制出异常。以SO为例,我的rest映射如下所示

用户servlet的

/users/*

/ posts /*用于posts servlet

映射顺序

扩展名显式(Path mappings)

  • Implicit (
  1. (/)

请改正我写错的地方。

票数 43
EN

Stack Overflow用户

发布于 2014-10-31 17:02:00

作为参考,在Tomcat >=版本6.0.29中,“失败的尝试#2”是完全正确的。

这是在版本6.0.29中修复的Tomcat错误的结果:

https://issues.apache.org/bugzilla/show_bug.cgi?id=50026

代码语言:javascript
复制
<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>
票数 3
EN

Stack Overflow用户

发布于 2008-10-28 20:32:52

我从未尝试过这样映射servlet,但我认为从技术上讲,/*确实既以/开头,又以/*结尾,即使两个匹配项都使用相同的字符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/234210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档