我正在尝试使用SpringMVC编写web应用程序。通常,我只是将一些虚构的文件扩展名映射到Spring的前端控制器上,并快乐地生活着,但这一次我将使用类似REST的URL,没有文件扩展名。
将上下文路径下的所有内容映射到前端控制器(我们称其为“tomcat应用程序”)意味着我也应该处理静态文件,这是我不愿意做的事情(为什么要重新发明另一个weel呢?),因此与tomcat的默认servlet (我们称之为"tomcat")的某种组合似乎是可行的。
我做了一些像这样的事情
<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 #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>有没有人能说点什么?
发布于 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:
/some-static-content-folder/test.png并且没有找到该文件。无论如何尝试
/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)
请改正我写错的地方。
发布于 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
<!-- 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>发布于 2008-10-28 20:32:52
我从未尝试过这样映射servlet,但我认为从技术上讲,/*确实既以/开头,又以/*结尾,即使两个匹配项都使用相同的字符。
https://stackoverflow.com/questions/234210
复制相似问题