2011-10-27 148 views
2

我是新的春季mvc3,我試圖創建一個簡單的項目以接近spring mvc3。來自mvc:資源的處理程序映射覆蓋其他映射,這些映射使用註釋定義

現在我遇到一些問題,當我嘗試服務器一些靜態資源文件。

因爲我用在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錯誤。

從春天文件,我嘗試使用<mvc:resource location="/res/" mapping="/res/**" />

但是,如果我在春天-servlet.xml中添加這個標籤,我發現,我可以得到的資源,現在文件,但我不能上網其他頁面。

這就是說,我有一個控制器:

@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文件。

通過在蝕調試器,我發現,當彈簧的init在方法「DispatchServlet」的「initHanderMapping」的handerMapping,它創建了兩個映射實例: BeanNameUrlHandlerMapping,並SimpleUrlHandlerMapping建立。

BeanNameUrlHandlerMapping的handelrMap屬性始終爲空,而SimpleUrlHandlerMapping始終包含url匹配映射。

當我添加標籤,其handerMapping屬性是:{/res/**=org.springframework.web.ser[email protected]}

當我刪除標記,該handelrMapping是:{/example/[email protected], /example/hello.*[email protected], /example/hello/[email protected]}

看來,該{/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> 

如何解決呢?

回答

3

嘗試將<mvc:annotation-driven />添加到您的上下文中。

<mvc:resource...>覆蓋了spring mvc的默認行爲。如果您在spring-servlet.xml中添加<mvc:annotation-driven />,則應該強制註冊所有必需的處理程序。

+0

你能給我更多的細節嗎? – hguser

+0

非常感謝!有用。但我想知道爲什麼春季文件沒有告訴讀者這一點! – hguser

+0

我同意,這並不明顯。 Spring文檔的第15.2節「DispatcherServlet」暗示了這一點:「Spring DispatcherServlet使用特殊的bean來處理請求並呈現相應的視圖,這些bean是Spring框架的一部分,你可以在WebApplicationContext中配置它們,就像你一樣配置任何其他bean。但是,對於大多數bean,提供了合理的默認值,因此您最初不需要配置它們。「它沒有直接指定的是,一旦你開始添加你自己的配置,默認值將被忽略。這更隱含。 – pap

0

更好的解決方案:

<mvc:resources mapping="/resources/**" location="/resources/" order="-1" /> 

這將指定資源的優先次序。

相關問題