我正在尝试使用 SpringMVC 编写一个 Web 应用程序。通常我只是将一些虚构的文件扩展名映射到 Spring 的前端控制器并快乐地生活,但这次我要使用类似 REST 的 URL,没有文件扩展名。
将我的上下文路径下的所有内容映射到前端控制器(我们称之为“app") 意味着我也应该处理静态文件,这是我不想做的事情(为什么要重新发明另一个 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>
任何人都可以透露一些信息吗?
我想我可能知道发生了什么事。
在您的工作 web.xml 中,您已将 servlet 设置为默认 servlet(如果没有其他匹配项,/ 本身就是默认调用的 servlet),它将回答任何与另一个映射不匹配的请求。
在 Failed 1 中,您的 /* 映射确实看起来是有效的路径映射。通过 web.xml 中的 /* 映射,它可以响应除其他路径映射之外的所有请求。根据规范,扩展映射是被显式映射覆盖的隐式映射。这就是扩展映射失败的原因。一切都明确映射到应用程序。
在失败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 https://stackoverflow.com/questions/132052Jetty 给出了你和我所期待的行为。
是否有某种原因您无法执行诸如为其余调用映射根目录之类的操作。像应用程序映射到 /rest_root/* 这样的东西比你负责在rest_root文件夹中发生的任何事情,但其他任何地方都应该由Tomcat处理,除非你进行另一个显式映射。我建议将其余 Servlet 设置为路径映射,因为它可以更好地声明意图。使用 / 或 /* 似乎不合适,因为您必须找出例外情况。以 SO 为例,我的其余映射将类似于
/users/* 用于用户 servlet
/posts/* 用于 posts servlet
映射顺序
- 显式(路径映射)
- 隐式(扩展映射)
- 默认 (/)
请纠正我任何错误的地方。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)