在spring 3中使用<mvc:resources … />会导致所有其他视图停止工作
最简单的例子:
我有一个调度程序servletconfiguration为捕捉一切:
<servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
我有一个简单的testing控制器:
@RequestMapping("/index") @ResponseBody public String rootTest(){ return "Main page displayed from TestController"; }
在这个testing用例中,我dispatcher-servlet.xml
下行添加(或删除)到dispatcher-servlet.xml
:
<mvc:resources mapping="/public/**" location="/public/"/>
我的崇高目标是:将静态内容(图像,CSS,js)和我的dynamic内容(通过Jetty servlet容器中的Velocity生成,与全能Spring捆绑在一起)一起提供。
我的困境:当我添加<mvc:resources .../>
我得到一个404 http://localhost/index
,但是我可以从http://localhost/public/img/42.png提供一个图片。 如果我删除<mvc:resources .../>
然后http://localhost/index
工作正常,但当然,我如何提供静态内容?
奖金的问题:为什么我不能吃我的蛋糕,也吃了呢?
有两个问题:
-
切勿在servlet映射中使用
/*
:<servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
<mvc:resources>
需要<mvc:annotation-driven>
(或显式声明的处理程序映射等)。发生这种情况是因为
DispatcherServlet
仅在没有在上下文中find自定义处理程序映射的情况下应用处理程序映射的默认configuration。 由于<mvc:resources>
添加了它自己的处理程序映射,所以默认值被破坏了,所以其他的处理程序映射应该被<mvc:annotation-driven>
或者手动的作为bean明确地去除。还要注意,
<mvc:resources>
只声明了DefaultAnnotationHandlerMapping
,并没有声明其他的映射,比如BeanNameUrlHandlerMapping
,尽pipe它们是DispatcherServlet
默认值。 如果您需要,请手动声明它们。
我之前也遇到过这个问题。 我的情况是我没有把所有的62弹簧框架的jar文件 (spring-framework-4.1.2.RELEASE版本),它没有工作。 然后我也把3.0.xsd换成了2.5或3.1进行testing,结果全部解决了。 当然,还有其他因素会影响你的结果。