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/"

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