最简单的例子:
我已经配置了一个调度程序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:
dispatcher-servlet.xml
<mvc:resources mapping="/public/**" location="/public/"/>
我的远大目标: 提供静态内容(图像,css,js)以及动态内容(通过Jetty servlet容器内的Velocity生成,与全能的Spring捆绑在一起)。
我的Dilema: 添加时<mvc:resources .../>得到404 http://localhost/index,但是我可以从http://localhost/public/img/42.png提供图像。如果删除,<mvc:resources .../>则http://localhost/index可以正常工作,但是,当然,如何投放静态内容?
<mvc:resources .../>
http://localhost/index
额外的问题: 为什么我永远也不会吃蛋糕呢?
有两个问题:
切勿/*在servlet映射中使用:
/*
<servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern>
<mvc:resources>需要<mvc:annotation-driven>(或显式声明的处理程序映射等)。
<mvc:resources>
<mvc:annotation-driven>
发生这种情况是因为DispatcherServlet仅当在上下文中未找到自定义处理程序映射时,才应用处理程序映射的默认配置。由于<mvc:resources>添加了自己的处理程序映射,因此默认值被破坏,因此应通过<mvc:annotation- driven>Bean或手动将其他处理程序映射显式除名。
DispatcherServlet
<mvc:annotation- driven>
另请注意,尽管它们默认为,但<mvc:resources>仅声明DefaultAnnotationHandlerMapping,而不声明其他映射,例如。如果需要,请手动声明它们。BeanNameUrlHandlerMapping``DispatcherServlet
DefaultAnnotationHandlerMapping
BeanNameUrlHandlerMapping``DispatcherServlet