本文转载至: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/"
;