本文轉載至:SpringMVC訪問靜態資源的三種方式,同時感謝原作者的整理與創作;
如果你在 web.xml
中使用了 DispatcherServlet
攔截 *.do
這樣的 URL
,就不存在訪問不到靜態資源的問題;
如果你的 DispatcherServlet
攔截 /
,那麼它將攔截所有的請求,對 js, css, 圖片
的訪問也將被攔截;
問題原因:罪魁禍首是 web.xml
下對 Spring
的 DispatcherServlet
請求 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
註解去配置,這樣的話靜態資源的訪問將得不到;
解決方案一:激活 Tomcat
的 defaultServlet
來處理靜態文件;
在 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/"
;