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

2022-09-01 00:07:18

最简单的例子:

我有一个调度程序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生成,与全能的春天捆绑在一起)。

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

奖金问题:为什么我从来不会有蛋糕,也吃蛋糕?


答案 1

有 2 个问题:

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

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

    发生这种情况是因为仅当上下文中找不到自定义处理程序映射时,才应用处理程序映射的默认配置。由于添加了自己的处理程序映射,因此默认值被破坏,因此其他处理程序映射应显式标记,无论是通过 bean 还是手动作为 bean。DispatcherServlet<mvc:resources><mvc:annotation-driven>

    另请注意,仅声明 和不声明其他映射,例如 ,尽管它们的默认值为 。如果需要,请手动声明它们。<mvc:resources>DefaultAnnotationHandlerMappingBeanNameUrlHandlerMappingDispatcherServlet


答案 2

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


推荐