当前位置:   article > 正文

SpringMVC 静态资源处理 详解_war包的mvc静态资源

war包的mvc静态资源
需要先调整 web.xml 中 DispatcherServlet 的配置,例如如下配置 :
< servlet >
    < servlet-name > springServlet </ servlet-name >
    < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >
    < init-param >
        < param-name > contextConfigLocation </ param-name >
        < param-value > classpath:spring-mvc.xml </ param-value >
    </ init-param >
    < load-on-startup > 1 </ load-on-startup >
</ servlet >
< servlet-mapping >
    < servlet-name > springServlet </ servlet-name >
    < url-pattern > / </ url-pattern >
</ servlet-mapping >

方法一 : 采用<mvc:default-servlet-handler/>
在 spring-mvc.xml 中配置
<!-- 将无法mapping到Controller的path交给default servlet handler处理 -->
< mvc :default-servlet-handler />
这样会在 SpringMVC 上下文中定义一个 org.springframework.web.servlet.resource.DefaultServletHttpRquestHandler,其会对进入 DispatcherServlet 的URL 进行筛选,若发现是静态资源请求,则转由 Web 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理
一般 Web 应用服务器 (包括 Tomcat、Jetty等)  默认Servlet名称都是 default,因此 DefaultServletHttpRquestHandler 可以找到。如果使用的 Web 应用服务器的默认 Servlet 名称不是 “default",则需要通过 default-servlet-name 属性显式指定 :
< mvc :default-servlet-handler default-servlet-name ="yourServerDefaultServletName" />

方法二 : 采用<mvc:resources/>
<mvc:default-servlet-handler/> 将静态资源的处理经由 Spring MVC 框架交回 Web 应用服务器处理。而 <mvc:resources/> 更进一步,由 Spring MVC 框架自行处理静态资源,并添加一些附加功能
<mvc:resources/> 允许静态资源放在任何地方,如 WEB-INF 目录下、类路径,甚至 JAR 包中,可以使用诸如 "classpath:" 等的资源前缀指定资源位置。可以通过 cacheSeconds 属性指定静态资源在浏览器端的缓存时间,一般设置为一年。在输出静态资源时,会根据配置设置好响应报头的 Expires 和 Cache-Control 值
在接收静态资源的获取请求时,会检查请求头的 Last-Modified 值,如果静态资源没有发生变化,则直接返回 303 响应状态码,指示客户端使用浏览器缓存的数据,而非静态资源的内容输出到客户端,以节省带宽,提高性能
在 spring-mvc.xml 中的配置
< mvc :resources mapping =“/resource/**" location ="/,classpath:/META-INF/publicResources/" />
该配置将 Web 根路径 “/“ 以及类路径 /META-INF/publicResources/ 映射为 /resource
Spring MVC在处理映射的静态资源时,会查看引用路径是否包含 WEB-INF 或 META-INF,如果存在则返回 null。可以通过将 /WEB-INF/ 设置在 location 属性中,此时可以通过访问到 web.xml :
< mvc :resources mapping ="/ resources /**" location ="/WEB-INF/" />
在设置<mvc:resources/>时,注意不要将不期望的资源暴露出去
可通过 cache-period 设置客户端数据缓存时间,如下设置为一年
< mvc :resources mapping ="/ resource /**" location =" /,classpath:/META-INF/publicResources/ " cache-period ="31536000" />

在实际开发中,发布新版本,即使服务端的 javascript、css等静态资源以发生变化,但由于客户端浏览器本身缓存管理机制问题,客户端并不会从服务端下载新的静态资源。一个好的解决方案是 : 网页中引用静态资源的路径添加应用的发布版本号,这样发布新的部署版本时,由于版本号的变更造成网页中竟资源台路径发生更改,从而是这些静态资源成为“新资源”,因此客户端会下载这个“新资源”,而不会使用缓存中的数据
创建 ServletContextAware 实现类
import javax.servlet.ServletContext;
import org.springframework.web.context.ServletContextAware;
public class ResourcePathExposer implements ServletContextAware {
    private ServletContext servletContext ;
    private String resourceRoot ;
    public void init() {
        String version = "1.2.1" ; // 实际应用中,可以在外部属性文件或数据库保存应用发布版本号,在此获取之。此处仅仅提供一个模拟值
        resourceRoot = "/resources-" + version; // 资源逻辑路径带上应用发布版本号
        getServletContext().setAttribute( "resourceRoot" , getServletContext().getContextPath() + resourceRoot ); // 将资源逻辑路径暴露到ServletContext的属性列表中
    }
    public void setServletContext(ServletContext servletContext) {
        this . servletContext = servletContext;
    }
    public String getResourceRoot() {
        return resourceRoot ;
    }
    public ServletContext getServletContext() {
        return servletContext ;
    }
}

在 spring-mvc.xml 中
< bean id ="rpe" class ="com.chenshun.web.ResourcePathExposer" init-method ="init" />
< mvc :resources mapping ="#{rpe.resourceRoot}/**" location ="/" cache-period ="31536000" />

在 jsp 页面中,通过 EL 引用 resourceRoot 属性值
<%@ page language =" java " contentType =" text/html; charset=UTF-8 " pageEncoding =" UTF-8 "%>
<%@ taglib prefix =" c " uri =" http://java.sun.com/jsp/jstl/core " %>
< html >
  < head >
    < title > 静态资源测试 </ title >
    < script src= " ${ resourceRoot } /js/test.js" type= "text/javascript" > </ script >
  </ head >
  < body >
    hello!! < script > test (); </ script >
  </ body >
</ html >

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号