Spring MVC訪問靜態資源

本文轉載至:SpringMVC訪問靜態資源的三種方式,同時感謝原作者的整理與創作;

如果你在 web.xml 中使用了 DispatcherServlet 攔截 *.do 這樣的 URL,就不存在訪問不到靜態資源的問題;
如果你的 DispatcherServlet 攔截 /,那麼它將攔截所有的請求,對 js, css, 圖片 的訪問也將被攔截;
問題原因:罪魁禍首是 web.xml 下對 SpringDispatcherServlet 請求 URL 映射的配置,原配置如下:

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:action-servlet.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

注意:上面代碼的 <url-pattern>/</url-pattern> 把全部請求交給 Spring 去處理,而請求的 URL 是在 Controller 層中通過 @RequestMapping 註解去配置,這樣的話靜態資源的訪問將得不到;


解決方案一:激活 TomcatdefaultServlet 來處理靜態文件;
web.xml 裏添加如下配置:

<servlet-mapping>
    <servlet-name>default</servlet-name>  
    <url-pattern>*.js</url-pattern>  
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>  
    <url-pattern>*.css</url-pattern>  
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>  
    <url-pattern>*.jpg</url-pattern>  
</servlet-mapping>

需配置多個,每種文件類型配置一個;
且需寫在 DispatcherServlet 的前面, 讓 defaultServlet 先攔截,這個就不會進入 Spring 了;


解決方案二:使用 mvc:resources [ spring3.0.4 以後的版本];

<!--對靜態資源文件的訪問-->  
<mvc:resources location="/images/" mapping="/images/**" />

location:本地資源路徑,是 webapp 根目錄下的路徑;
mapping:映射地址,那麼訪問地址爲:${pageContext.request.contextPath}/images/xxx.jpg
*:兩個星號,它表示映射 resources/ 下所有的 URL,包括子路徑(即接多個 /);
注意:如果你將靜態資源放在 WEB-INF 文件下,那麼你需要在 location 前加入 /WEB-INF,即爲:location="/WEB-INF/images/"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章