Spring Boot使用Rythm模板自定义标签给资源文件加上版本号
博客专区 > xiwa 的博客 > 博客详情
Spring Boot使用Rythm模板自定义标签给资源文件加上版本号
xiwa 发表于7个月前
Spring Boot使用Rythm模板自定义标签给资源文件加上版本号
  • 发表于 7个月前
  • 阅读 83
  • 收藏 4
  • 点赞 1
  • 评论 1

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Rythm标签
  1. 目的
    当资源文件发生变化的时候,为了防止浏览器用的还是原来缓存的文件,因此需要为资源文件链接加上版本号。
  2. 注册资源解析器
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    		registry.addResourceHandler("/static/**")
    				.addResourceLocations("/static/")
    				.resourceChain(true)
    				.addResolver(new VersionResourceResolver()//使用版本资源解析器
    				.addContentVersionStrategy("/**"));//使用文件内容来生成版本号的策略
    }

     

  3. 创建resource自定义标签
    
    @Component
    public class ResourceTag extends JavaTagBase implements ApplicationContextAware
    {
      public String __getName()
      {
        return "res";
      }
    
      private static ResourceUrlProvider resourceUrlProvider;
    
      protected void call(__ParameterList params, __Body body)
      {
        Object obj = params.getDefault();
        HttpServletRequest request = WebContext.getRequest();
        String contextPath = request.getContextPath();
    
        if ((obj != null) && ((obj instanceof String))){
          String url = (String)obj;
          //调用ResourceUrlProvider提供的方法查找ResourceHandlerRegistry中注册的资源
          //返回文件名+文件内容md5格式的资源链接
          url=resourceUrlProvider.getForLookupPath(url);
          if ((url.startsWith("http")) || (url.startsWith("//"))) {
            p(url);
          }else{
            p(contextPath + url);
          }
        }
      }
    
      /**
       * 实现ApplicationContextAware接口以便取得ResourceUrlProvider实例
       * @param context
       * @throws BeansException
       */
      @Override
      public void setApplicationContext(ApplicationContext context) throws BeansException {
        if(resourceUrlProvider==null){
          resourceUrlProvider=BeanFactoryUtils.beanOfTypeIncludingAncestors(context, ResourceUrlProvider.class, true, false);
        }
      }
    }

    记得在RythmEngine中注册标签:

    
    	  protected void configBuildInTag(RythmEngine engine) {
    	    AutowireCapableBeanFactory factory = getApplicationContext().getAutowireCapableBeanFactory();
    	    for (Class<?> clazz : defaultTagClasses()) {
    	      Object tag = factory.autowire(clazz, 3, false);
    	      engine.registerFastTag((JavaTagBase) tag);
    	    }
    	  }
    	  
    	  protected List<Class<?>> defaultTagClasses() {
    	    List<Class<?>> classes = new ArrayList<Class<?>>();
    	    classes.add(UrlTag.class);
    	    classes.add(ValTag.class);
    	    classes.add(ErrorTag.class);
    	    classes.add(ResourceTag.class);
    	    return classes;
    	  }

     

  4. 在模板中使用@res标签
    <script type="text/javascript" src="@res("/static/js/jquery-1.10.2.min.js")"></script>

     

  5. 效果:
    <script type="text/javascript" src="/static/js/jquery-1.10.2.min-628072e7212db1e8cdacb22b21752cda.js"></script>

    相关参考文档:
    springboot:http://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-static-content
    rythm:http://rythmengine.org/

标签: Spring Boot rythm
共有 人打赏支持
xiwa
粉丝 5
博文 4
码字总数 4256
作品 2
评论 (1)
罗格林
非常实用的功能!
×
xiwa
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: