近日切换java开发,开始学习springframework。在实现静态资源文件自动计算版本号的实例时,因为不熟悉框架,走了不少弯路,好在最终解决了问题。这里写篇文章记录一下实现,也希望对大家有些用处。

开发工具: eclipse,spring版本:5.0.1.RELEASE

  功能用途:为静态资源文件计算版本号,可以避免客户端缓存了静态资源后,无法及时刷新服务器上最新版本文件的问题

  实现主要步骤说明:

1、web.xml 配置springmvc的DispatcherServlet,拦截所有的请求(包括静态资源请求);

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>my springmvc</display-name>
<servlet>
<!-- 配置DispatcherServlet -->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 设置启动顺序 -->
<!-- 指定spring mvc配置文件位置 不指定使用默认情况 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>/WEB-INF/spring-mvc.xml,classpath*:/applicationContext.xml</param-value> -->
<param-value>/WEB-INF/spring-mvc.xml,classpath*:application-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置映射 servlet-name和DispatcherServlet的servlet一致 -->
<!-- 静态资源要通过 DispatcherServlet 进行分发,这样才能进行版本解析 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 拦截以/所有请求,服务端请求可以自己添加 .do 后缀即可 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

2、spring-mvc.xml 配置静态资源的映射,以及MD5版本计算策略;

    <!--*:扫描所有的包,**:扫描所有的包&class-->
<context:component-scan base-package="simm.spring.**" use-default-filters="true"/>
<!--######## 静态资源的请求以及地址映射 begin #######-->
<mvc:resources mapping="/static/**" location="/static/">
<mvc:resource-chain resource-cache="true">
<mvc:resolvers>
<mvc:version-resolver>
<mvc:content-version-strategy patterns="/**"/>
</mvc:version-resolver>
</mvc:resolvers>
</mvc:resource-chain>
</mvc:resources>

<!--######## 静态资源的请求以及地址映射 end #######-->

3、实现一个@ControllerAdvice 控制器全局增强类,对所有的controller进行拦截,输出ResourceUrlProvider 属性到view层;

/**
* 控制器的全局增强
* @author wh-simm
*
*/
@ControllerAdvice
public class ControllerConfig {
@Autowired
ResourceUrlProvider resourceUrlProvider; @ModelAttribute("urls")
public ResourceUrlProvider urls() {
return this.resourceUrlProvider;
}

4、FreeMarker 模板上通过调用ResourceUrlProvider.getForLookupPath(string url) 获取带有版本号的静态资源;

resouceimp.ftl 宏方法定义

<#-- 静态资源版本控制 --><#macro cssRef url>
<link rel="stylesheet" type="text/css" href="${request.contextPath}${urls.getForLookupPath(url)}" />
</#macro>
<#macro jsRef url>
<script type="text/javascript" src="${request.contextPath}${urls.getForLookupPath(url)}"></script>
</#macro>
<#-- 获取请求地址 带context -->
<#macro geturl url>
${request.contextPath}${url}
</#macro>

_base.ftl 母版页实现

<#macro layout>
<#include "/templates/resouceimp.ftl"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title><#nested "title"/>-Spring-Boot</title>
<link rel="shortcut icon" type="image/ico" href="${request.contextPath!}/favicon.ico">
<!-- basic styles -->
<@cssRef url="/static/_resources/bootstrap/css/bootstrap.min.css"/>
<#nested "css" />
<@jsRef url="/static/_resources/jquery/jquery-2.0.3.min.js"/>
<@jsRef url="/static/_resources/common/utility.js"/>
</head>
<body class="easyui-layout layout panel-noscroll" style="background-color:white;">
<#nested "content" />
<input type="hidden" id="hid_contextpath" value="${request.contextPath!}"/>
<input type="hidden" id="_mode" value="${formMode!}" />
</body>
</html>
<!-- ace scripts -->
<@jsRef url="/static/_resources/bootstrap/js/bootstrap.min.js"/>
<@jsRef url="/static/_resources/bootstrap/js/bootstrap-table.js"/>
<@jsRef url="/static/_resources/bootstrap/js/bootstrap-table-zh-CN.js"/>
<#nested "scripts"/>
</#macro>

test.html 测试页面

<#include "/templates/_base.ftl"/>
<@layout;section>
<#if section="title"> 测试界面
<#elseif section="css">
<#elseif section="content">
<p>Greeting : ${greeting}</p>
<p>Context : ${request.contextPath!}</p>
<p>Author : ${author!}</p>
<#elseif section="scripts">
<script type="text/javascript">
$(function () {
alert("页面初始化完成");
});
</script>
</#if>
</@layout>

5、请求结果展示

参考资料

http://blog.csdn.net/xichenguan/article/details/52794862

http://blog.csdn.net/isea533/article/details/50412212

http://www.bubuko.com/infodetail-905264.html

SpringMVC+FreeMarker实现静态资源文件自动添加版本号(md5)的更多相关文章

  1. 为js和css文件自动添加版本号

    web应用必然要面对缓存问题,无论前台后台都会涉足缓存.特别是对于前端而言,缓存利用的是否得当直接关系到应用的性能. 通常情况下,我们会倾向于使用缓存,因为缓存一方面可以减少网络开销,一方面可以减轻服 ...

  2. gulp自动化打包及静态文件自动添加版本号

    前端自动化打包发布已是一种常态,尤其在移动端,测试过程中静态资源的缓存是件很头疼的事情,有时候明明处理的bug测试还是存在,其实就是缓存惹的祸,手机不比pc浏览器,清理缓存还是有点麻烦的.所以自动化实 ...

  3. SpringMVC 部署项目静态资源文件访问问题

    问题:采用SpringMVC 部署项目后程序加载或用浏览器访问时出现类似的警告,2011-01-19 10:52:51,646 WARN [org.springframework.web.servle ...

  4. springmvc+freemarker生成静态html文件

    参考资料: http://mylfd.iteye.com/blog/1896501 http://www.cnblogs.com/xxt19970908/p/5553045.html 个人实践: 1. ...

  5. 引用静态资源的url添加版本号,解决版本发布后的浏览器缓存有关问题

    在日常的工作中,我们经常会遇到页面文件(html,jsp等)中引用的js,css,图片等被修改后,而浏览器依然缓存着老版本的文件,客户一时半会看不到修改后的效果,同时也给生产环境的版本发布带来了一些问 ...

  6. springmvc基础篇—处理图片静态资源文件

    当我们在web.xml中对DispatcherServlet的过滤设置为/ 的时候,表示对所有的路径进行拦截过滤,那么不可避免的就会产生一个问题,那就是像图片这种静态资源文件我明明引用路径有,但就是加 ...

  7. Spring Boot中的静态资源文件

    Spring Boot中的静态资源文件 1.SSM中的配置 2.Spring Boot 中的配置 2.1 整体规划 2.2 源码解读 2.3 自定义配置 2.3.1 application.prope ...

  8. Spring MVC 处理静态资源文件

    摘要: 三个方案: 1.方案一:激活Tomcat的defaultServlet来处理静态文件 2.方案二: 在spring3.0.4以后版本提供了mvc:resources (需要配置annotati ...

  9. spring mvc静态资源文件的引用

    在页面的<title>下 <link rel="stylesheet" href="<%=request.getContextPath()%> ...

随机推荐

  1. 在Pycharm中运行Scrapy爬虫项目的基本操作

    目标在Win7上建立一个Scrapy爬虫项目,以及对其进行基本操作.运行环境:电脑上已经安装了python(环境变量path已经设置好), 以及scrapy模块,IDE为Pycharm .操作如下: ...

  2. 2017-06-26(groupadd groupmod groupdel)

    groupadd groupadd  组名  (创建用户组) groupadd -g  组编号   组名 (创建组名 并且指定编号) groupmod groupmod  -n   新组名  旧组名 ...

  3. 2017-06-22(locate shutdown half poweroff init0 reboot init 6)

    locate locate 文件搜索命令 格式:locate  [文件名] locate 在后台数据库中(/var/lib/mlocate/mlocate.db)按文件名搜索,速度快 刚刚新建的文件, ...

  4. php 在foreach中循环数组的时候添加元素的属性

    foreach($arr as $k => &$v){ //注意,由于上面遍历的时候写了地址传值符&, //所以下面可以直接给$v 赋值;如果不写&符号,下面这样写是没有 ...

  5. awk 指定{}内x的替换

    替换{}中的x为;   原字符串 oxo{axbxc}oxo{dxexf}oxo 结果 oxo{a;b;c}oxo{d;e;f}oxo     awk '{for(i=1;i<=NF;i++){ ...

  6. 2018-02-02-解决IDE中无法忽略的非代码文件

    layout: post title: 2018-02-02-解决IDE中无法忽略的非代码文件 key: 20180202 tags: GIT 版本管理 modify_date: 2018-02-02 ...

  7. Cisco配置aaa验证

    当您的网络中部署了一台集中的radius校验服务器(比如我司的SAM,cisco的ACS等),希望对登陆设备的用户身份进行合法性校验,而账号都统一由该radius服务器集中产生与维护,您希望所有的登入 ...

  8. 面试中的Java链表

    链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...

  9. linux上的用户管理

    作为一个专业的服务器发行版,CentOS上存在着n多个用户,作为一个专业的运维工程师,linux的用户管理和用户组的管理是做为一个SA必不可少的工作. 下面我们就先来谈谈linux中的用户管理: us ...

  10. 【AIX】AIX内存机制

    [AIX]AIX内存机制 1  虚拟内存 虚拟内存是物理内存和交换空间(Paging Space)组合形成的虚拟内存空间, 通过虚拟的地址空间映射到物理内存或者 Paging Space. 在 AIX ...