SpringMVC访问静态资源的三种方式

17人阅读 评论(0) 收藏 举报
分类:

如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。

问题原因:罪魁祸首是web.xml下对spring的DispatcherServlet请求url映射的配置,原配置如下:

[html] view plain copy
  1. <servlet>  
  2.     <servlet-name>spring</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <load-on-startup>1</load-on-startup>  
  5.  </servlet>  
  6.  <servlet-mapping>  
  7.         <servlet-name>spring</servlet-name>  
  8.         <span style="BACKGROUND-COLOR: #ffff33"><url-pattern>/</url-pattern>  
  9. </span> </servlet-mapping>  

分析原因:<servlet-mapping>的<url-pattern>/</url-pattern>把所有的请求都交给spring去处理了,而所有available的请求url都是在Constroller里使用类似@RequestMapping(value = "/login/{user}", method = RequestMethod.GET)这样的注解配置的,这样的话对js/css/jpg/gif等静态资源的访问就会得不到。

目的:可以正常访问静态文件,不要找不到静态文件报404。
方案一:激活Tomcat的defaultServlet来处理静态文件

在web.xml里添加如下配置

[html] view plain copy
  1. <servlet-mapping>  
  2.     <servlet-name>default</servlet-name>  
  3.     <url-pattern>*.jpg</url-pattern>  
  4. </servlet-mapping>  
  5. <servlet-mapping>  
  6.     <servlet-name>default</servlet-name>  
  7.     <url-pattern>*.js</url-pattern>  
  8. </servlet-mapping>  
  9. <servlet-mapping>  
  10.     <servlet-name>default</servlet-name>  
  11.     <url-pattern>*.css</url-pattern>  
  12. </servlet-mapping>  

要配置多个,每种文件配置一个。
要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了,我想性能是最好的吧。

Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字  -- "FileServlet"
WebSphere  默认 Servlet的名字 -- "SimpleFileServlet"

方案二: 在spring3.0.4以后版本提供了mvc:resources

<mvc:resources> 的使用方法:

[html] view plain copy
  1. <!--对静态资源文件的访问-->  
  2. <mvc:resources mapping="/images/**" location="/images/" />    

/images /**映射到 ResourceHttpRequestHandler 进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period可以使得静态资源进行web cache。

如果出现下面的错误,可能是没有配置 <mvc:annotation-driven /> 的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

使用 <mvc:resources/> 元素,把 mapping 的 URI 注册到 SimpleUrlHandlerMapping的urlMap 中,key 为 mapping 的 URI pattern值,而value为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问.另外需要注意的一点是,不要对 SimpleUrlHandlerMapping 设置 defaultHandler. 因为对 static uri 的 defaultHandler 就是ResourceHttpRequestHandler,否则无法处理static resources request.

mapping:映射
location:本地资源路径,注意必须是webapp根目录下的路径。
两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)
陷阱:
配置的location一定要是webapp根目录下才行,如果你将资源目录,放置到webapp/WEB-INF下面的话,则就会访问失败。这个问题常常会犯。
错误方式:

WEB-INF目录作用
WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
 当然,你非要放在WEB-INF中,则必须修改resources映射,如:

[html] view plain copy
  1. <span style="BACKGROUND-COLOR: #ffff33"><mvc:resources mapping="/js/**" location="/WEB-INF/js/" /></span>  

推荐方式:maven项目的目录结构为如下图所示。

方案三 ,使用<mvc:default-servlet-handler/>

<mvc:default-servlet-handler/>会把 "/**" url,注册到 SimpleUrlHandlerMapping 的 urlMap 中,把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet.

补充说明:多个HandlerMapping的执行顺序问题:
DefaultAnnotationHandlerMapping 的 order 属性值是:0
<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping 的 order 属性值是: 2147483646
<mvc:default-servlet-handler/>自动注册的 SimpleUrlHandlerMapping 的 order 属性值是:2147483647
spring 会先执行 order 值比较小的。当访问一个 a.jpg 图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫 a.jpg 的 Action。再按 order 值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**" 的,所以一定会匹配上,再响应图片。

最后再说明一下,如何你的 DispatcherServlet 拦截 *.do 这样的 URL,就不存上述问题了。
查看评论

SpringMVC Spring MyBatis整合

-
  • 1970年01月01日 08:00

SpringMVC 访问静态资源的三种方式

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg...
  • mhl29
  • mhl29
  • 2016-06-08 14:50:37
  • 989

springmvc访问静态资源的三种方式

1.激活 Tomcat 的 defaultServlet 来处理静态资源  方案二:Spring 3.0.4 以后版本提供了   方案三:使用...
  • qq_30169035
  • qq_30169035
  • 2017-09-15 15:49:45
  • 51

SpringMVC 三种访问静态资源的方式

如果你的servlet拦截映射是*.do这类型的话久不存在无法访问静态资源的问题了,如果映射为/,则需要来处理后才能访问: 一:配置: SpringMVC上下文中定义了一个DefaultServl...
  • ldw201510803006
  • ldw201510803006
  • 2017-10-16 16:29:44
  • 87

SpringMVC权限和资源的安全访问(一)

一、静态资源的访问, css、js、static页面 我们知道SpringMVC的核心配置是DispatcherServlet,我们所有的请求都要经过Servlet    springMVC   ...
  • xiaojiesu
  • xiaojiesu
  • 2015-10-27 18:02:37
  • 1267

SpringMVC访问不到静态资源的几种解决方法!

解决方法1:在web.xml中进行配置,不需要拦截的都需要配置一下 default *.png ...
  • sunshinezx8023
  • sunshinezx8023
  • 2017-07-20 15:56:00
  • 2414

SpringMVC访问静态资源的几种方法

搭建SpringMVC环境测试发现前台JSP引用的JS找不到,自己查看发现并不是路径的问题,查找发现SpringMVC访问静态资源需要再配置,配置方法如下 第一种:在web.xml中配置名为defau...
  • csdn_mrsongyang
  • csdn_mrsongyang
  • 2015-07-24 13:54:50
  • 311

spring mvc 中对静态资源的访问配置

spring mvc 的java web中对静态资源的访问配置
  • whereismatrix
  • whereismatrix
  • 2017-01-08 22:47:45
  • 2405

springMVC访问静态资源——js、css、img等资源访问不到

springMVC访问静态资源——js、css、img等资源访问不到
  • wild46cat
  • wild46cat
  • 2016-09-07 10:02:29
  • 11795

springMVC对静态资源访问的处理

在restful  风格下springMVC会进行如下配置                mvc       org.springframework.web.servlet.DispatcherSe...
  • seelye
  • seelye
  • 2016-06-13 16:57:29
  • 2480
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 524
    排名: 9万+