Spring MVC静态资源处理问题

     由于在web.xml中配置Spring MVC的servlet 对应的 url-pattern 定义成 /,因此该 servlet 会匹配如 /images/a.jpg, /css/b.css 等这些静态资源,甚至包括 /jsp/index.jsp 这些 jsp 也会匹配。但是并没有定义相应的 Controller 来处理这些资源,因此这些请求通常是无法完成的。因此需要对这些资源做一些处理。

   

方法一:激活 Tomcat 的 defaultServlet 来处理静态资源 

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


     每种类型的静态资源需要分别配置一个 servlet-mapping,同时,要写在 DispatcherServlet 的前面, 让 defaultServlet 先拦截。
    但是这样还会有个问题,就是无法访问到classpath下的资源文件,看了tomcat的DefaultServlet的配置项,似乎也没有可以指定目录的地方。


方法二:Spring 3.0.4 以后版本提供了 <mvc:resources /> 

<!-- 处理静态资源 -->  
<!-- 上传的图片缓存1个月,其他js,css,img资源缓存一年 -->  
   <mvc:resources mapping="/res/**" location="/res/" cache-period="2592000"/>   
   <mvc:resources mapping="/resources/**" location="/resources/" cache-period="31536000"/>   
   <mvc:resources mapping="/css/**" location="/css/" cache-period="31536000"/>  
   <mvc:resources mapping="/js/**" location="/js/" cache-period="31536000"/>  
   <mvc:resources mapping="/img/**" location="/img/" cache-period="31536000"/>  
   <mvc:resources mapping="/images/**" location="/images/" cache-period="31536000"/> 


     使用 <mvc:resources /> 元素,会把 mapping 的 URI 注册到 SimpleUrlHandlerMapping 的 urlMap 中,key 为 mapping 的 URI pattern 值,而 value 为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到 ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问。


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

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


总结:
    性能最好的是直接利用容器的DefaultServlet,让它最先拦截静态资源请求,这样就避免了后续的转发等操作,提高了性能,但是无法访问classpath下的资源文件。而通过mvc:resources标签可以简单配置匹配规则和资源文件路径,是最简单快捷的一种方式

 

ps:方法二和方法三用到的xml声明

xmlns:mvc=http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd





你可能感兴趣的:(spring,mvc,静态资源处理)