zoukankan      html  css  js  c++  java
  • Spring-访问静态资源文件的方法

    转自:  http://blog.163.com/zhangmihuo_2007/blog/static/27011075201453044959574?suggestedreading
    如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。
    SpringMVC(3)SpringMVC访问静态资源文件的方法 - 月上西楼 - 月上西楼
     
    通过上面url-pattern的配置,所有URL请求都将被Spring MVC的DispatcherServlet截获。这样的配置,会造成js文件、css文件、图片文件等静态资源无法访问。 
     
    比如,你的jsp页面引用了一个图片和juqery:
    <body>
        <h3>图片访问</h3>
        <img src="image/1.jpg">
    </body>  
    那么,很抱歉,运行会提示404错误,找不到图片资源,因为SpringMVC把“image/1.jpg”也当做了一个请求连接,但这个请求连接我们并没有。
     
    解决方法:

    1、spring.3.0.4以后版本提供的<mvc:resources />(推荐使用此方式)

            a)首先,<mvc:resources />允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript 等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸 如"classpath:"等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,<mvc:resources />完全打破了这个限制。 
            b)其 次,<mvc:resources />依据当前著名的Page Speed、YSlow等浏览器优化原则对静态资源提供优化。你可以通过cacheSeconds属性指定静态资源在浏览器端的缓存时间,一般可将该时间 设置为一年,以充分利用浏览器端的缓存。在输出静态资源时,会根据配置设置好响应报文头的Expires 和 Cache-Control值。 
            在接收到静态资源的获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存的数据,而非将静态资源的内容输出到客户端,以充分节省带宽,提高程序性能。 
    在spring-servlet.xml中添加如下配置:
    <mvc:resources location="/image/" mapping="/image/**"/>  
    或者:
    <mvc:resources location="/,classpath:/META-INF/image/" mapping="/image/**"/>  
    以 上配置将Web根路径"/"及类路径下 /META-INF/image/ 的目录映射为/image路径。假设Web根路径下拥有images、js这两个资源目录,在images下面有bg.gif图片,在js下面有 test.js文件,则可以通过 /images/1.jpg这个静态资源。
     
    假设WebRoot还拥有images/bg1.gif 及 js/test1.js,则也可以在网页中通过 /resources/images/bg1.gif 及 /resources/js/test1.js 进行引用。
     
    也可以简单配置WEB-INF/spring-servlet.xml如下:
    <!-- 静态资源访问 -->
    <mvc:resources location="/image/" mapping="/image/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>
    <mvc:resources location="/css/" mapping="/css/**"/>  
    需要也别注意的是:使用此方式需要导入 org.springframework.web.servlet-3.1.4.RELEASE.jar包到WEB/lib目录下,而且版本要大于3.0.4,否则,在开发环境下会产生对resources元素没找到情况:
    cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mvc:resources'。
    必须在运行环境下就没有这个问题,这是3.0.4版的一个bug,会在3.0.5中更新spring-mvc-3.0.4.xsd。

    2、激活Tomcat的defaultServlet来处理静态文件

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <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>  
    要配置多个,每种文件配置一个  
    要写在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"
     
    最后再说明一下,如何你的 DispatcherServlet 拦截 *.do 这样的 URL,就不存上述问题了。
  • 相关阅读:
    target runtime apache v6.0 not defined解决
    java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    The valid characters are defined in RFC 7230 and RFC 3986问题
    invalid END header解决方法
    You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    在eclipse中import java web项目时遇到的一些问题并将该项目通过tomcat发布
    java byte转string 涉及到字节流中有中文
    spring+mybatis框架搭建时遇到Mapped Statements collection does not contain value for...的错误
    试试看读一下Zepto源码
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/5753572.html
Copyright © 2011-2022 走看看