我正在尝试使用SpringMVC编写Web应用程序.通常情况下,我只是将一些伪造的文件扩展名映射到Spring的前端控制器并幸福地生活,但这次我要使用类似REST的URL,没有文件扩展名.
将我的上下文路径下的所有内容映射到前端控制器(让我们称之为" app ")意味着我也应该处理静态文件,这是我不想做的事情(为什么要重新发明另一个呢?),所以某些与tomcat默认的组合servlet(让我们称之为" tomcat ")似乎是要走的路.
我有工作做的事情
app
/
tomcat
*.ext
并为我的静态内容的每个文件扩展名重复后者.我只是想知道为什么以下设置,对我来说等同于上面的设置,不起作用.
app
/*
tomcat
*.ext
app
/
tomcat
/some-static-content-folder/*
任何人都能解释一下吗?
我想我可能知道发生了什么.
在您正在工作的web.xml中,您已将servlet设置为默认的servlet(/如果没有其他匹配,则调用默认的servlet),它将回答与另一个映射不匹配的任何请求.
在失败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提供静态内容 Jetty给出了你和我期待的行为.
是否有某些原因使您无法执行某些操作,例如为您的其余调用映射根目录.像app映射到/ rest_root/*之类的东西比你负责rest_root文件夹中发生的任何事情,但是其他地方应该由Tomcat处理,除非你做了另一个显式映射.我建议将其余的servlet设置为路径映射,因为它更好地声明了intent.使用/或/*似乎不合适,因为您必须映射异常.以SO为例,我的其余映射就像是
/ users/*用于用户servlet
/ posts/*为post servlet
映射顺序
显式(路径映射)
隐式(扩展映射)
默认(/)
请纠正我错的任何事情.