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

Dav*_*rks 46 java spring-mvc

最简单的例子:

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

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

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

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

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

<mvc:resources mapping="/public/**" location="/public/"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

axt*_*avt 65

有两个问题:

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

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

    发生这种情况是因为DispatcherServlet仅当在上下文中找不到自定义处理程序映射时才应用处理程序映射的默认配置.由于<mvc:resources>添加了自己的处理程序映射,因此默认值会被破坏,因此其他处理程序映射应该通过<mvc:annotation-driven>bean手动或作为bean 显式地进行十字转换.

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