在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工作正常,但当然,我如何提供静态内容?

奖金的问题:为什么我不能吃我的蛋糕,也吃了呢?

有两个问题:

  1. 切勿在servlet映射中使用/*

     <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 
  2. <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,结果全部解决了。 当然,还有其他因素会影响你的结果。