在spring 3中使用<mvc:resources ... =“”>会导致所有其他视图停止工作</mvc:resources>

时间:2010-10-30 06:24:00

标签: java spring-mvc

最简单的例子:

我有一个调度程序servlet配置为捕获所有内容:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

我有一个简单的测试控制器:

@RequestMapping("/index")
@ResponseBody
public String rootTest(){
    return "Main page displayed from TestController";
}

在此测试用例中,我将以下行添加(或删除)到dispatcher-servlet.xml

<mvc:resources mapping="/public/**" location="/public/"/>

我的崇高目标:提供静态内容(图像,css,js)以及我的动态内容(通过Jetty servlet容器中的Velocity生成,与全能的Spring捆绑在一起)。

我的困境:当我添加<mvc:resources .../>时,我获得http://localhost/index的404,但我可以提供http://localhost/public/img/42.png的图像。如果我删除<mvc:resources .../>,那么http://localhost/index工作正常,但当然,我如何提供静态内容?

奖金问题:为什么我从来没有吃过蛋糕呢?

3 个答案:

答案 0 :(得分:65)

有两个问题:

  1. 永远不要在servlet映射中使用/*

    <servlet-mapping> 
        <servlet-name>dispatcher</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    
  2. <mvc:resources>需要<mvc:annotation-driven>(或显式声明的处理程序映射等)。

    这是因为DispatcherServlet仅在上下文中找不到自定义处理程序映射时才应用处理程序映射的默认配置。由于<mvc:resources>添加了自己的处理程序映射,因此默认值被破坏,因此其他处理程序映射应该由<mvc:annotation-driven>显式地或者作为bean手动地进行十分方式。

    另请注意,<mvc:resources>仅声明DefaultAnnotationHandlerMapping并且未声明其他映射,例如BeanNameUrlHandlerMapping,但它们的默认值为DispatcherServlet。如果需要,可以手动声明它们。

答案 1 :(得分:0)

我之前也遇到过这个问题。我的情况是我没有将所有62个spring框架jar放入lib文件(spring-framework-4.1.2.RELEASE版本),它确实有效。然后我还将3.0.xsd更改为2.5或3.1进行测试,一切顺利。当然,还有其他因素会影响您的结果。

答案 2 :(得分:-3)

将“mvc:annotation-driven”行添加到视图解析器SpringWeb.XML文件中。这对我有用