gpt4 book ai didi

spring - 来自 mvc :resource override other mappings which defined with annotation 的处理程序映射

转载 作者:行者123 更新时间:2023-12-04 06:09:44 25 4
gpt4 key购买 nike

我是 spring mvc3 的新手,我正在尝试创建一个简单的项目来接近 spring mvc3。

现在,当我尝试为一些静态资源文件提供服务时遇到了一些问题。

因为我在 web.xml 中使用了 url-pattern (/):

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

所以,当我输入: http://locaohost:8080/spring/res/css/main.css .我会收到 404 错误。

从 spring 文档中,我尝试使用 <mvc:resource location="/res/" mapping="/res/**" />
但是如果我在 spring-servlet.xml 中添加这个标签,我发现,我现在可以获取资源文件,但我无法访问其他页面。

也就是说,我有一个 Controller :
@Controller
@RequestMapping("/example")
public class HelloController {

@RequestMapping("hello")
public String hello(Model model){
model.addAttribute("name", "John");
return "spring.example.hello";
}
}

当我访问时: http://locaohost:8080/spring/example/hello,I现在将得到 404。

但是如果我删除标签: <mvc:resource xxx/>
我可以访问 http://locaohost:8080/spring/example/hello,but我无法获取 .css/.js 文件。

通过eclipse中的debugger,我发现spring在“DispatchServlet”的“initHanderMapping”方法中初始化handerMapping时,创建了两个映射实例:
BeanNameUrlHandlerMapping 和 SimpleUrlHandlerMapping。

BeanNameUrlHandlerMapping 的handelrMap 属性始终为空,而SimpleUrlHandlerMapping 始终包含url 匹配映射。

当我添加标签时,它的handerMapping属性是: {/res/**=org.springframework.web.servlet.resource.ResourceHttpRequestHandler@1120eed}
当我删除标签时,handelrMapping 是: {/example/hello=com.spring.controller.HelloController@1b5438d, /example/hello.*=com.spring.controller.HelloController@1b5438d, /example/hello/=com.spring.controller.HelloController@1b5438d} .

看来, {/res/**=xxxx}覆盖其他映射 {/example/helloxxxxx}
这是 spring-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- <mvc:resources location="/res/" mapping="/res/**"></mvc:resources>-->
<context:component-scan base-package="com.spring.controller" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/jsp/tile_def.xml</value>
</list>
</property>
</bean>
</beans>

如何解决?

最佳答案

尝试添加 <mvc:annotation-driven />到你的上下文。
<mvc:resource...>覆盖 spring mvc 的默认行为。如果您添加 <mvc:annotation-driven />到您的 spring-servlet.xml,它应该强制注册所有必需的处理程序。

关于spring - 来自 mvc :resource override other mappings which defined with annotation 的处理程序映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com