avatar

目录
静态资源处理及webjars理解

疑问

SpringBoot默认是没有 webapp 目录的,那我们资源应该放在哪里呢?

分析源码

SpringMVC 整个 SSM 都是基于它的,所以我们第一步应该去研究 SpringBoot 关于Mvc的自动配置!

  1. 所有mvc相关的配置都在 WebMvcAutoConfiguration (视图解析器、静态资源过滤!)
  2. addResourceHandlers 静态资源处理方法
    java
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
      // 禁用默认规则的一个配置,如果你手动的添加了资源映射路径的配置,那么这些自动配置就会直接失
    效!
      if (!this.resourceProperties.isAddMappings()) {
        logger.debug("Default resource handling disabled");
        return;
     }
      // 缓存控制
      Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
      CacheControl cacheControl =
    this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
      // 分析源代码,需要掌握看对象的方法调用!
     
      if (!registry.hasMappingForPattern("/webjars/**")) {
      
     customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
                         
    .addResourceLocations("classpath:/META-INF/resources/webjars/")
                         
    .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
     }
     
      // 获取静态资源路径!
      String staticPathPattern = this.mvcProperties.getStaticPathPattern();
      // localhost:8080/
      // 如果访问映射的路径是 staticPathPattern = "/**";
      // this.resourceProperties.getStaticLocations())
      if (!registry.hasMappingForPattern(staticPathPattern)) {
        customizeResourceHandlerRegistration(registry.addResourceHandler("/**")
                         
    .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLoca
    tions()))
                         
    .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
     }
    }

    什么是 webjars

    官方网址
    webjars

简单的说就是使用maven,用jar包的方式引入前端静态资源。

xml
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.4.1</version>
</dependency>
  • 根据源码分析:
    • 当我们访问localhost:8080/webjars/jquery.js时
    • 判断是否存在一个映射路径 /webjars/**,
    • addResourceHandler 处理逻辑 /webjars/a.js
    • addResourceLocations 处理资源的地址 classpath:/META-INF/resources/webjars/a.js
      webjars-jquery
  • 网址访问一下,发现是可以访问成功了,那么现在回过头看源码就显得清晰多了
    sucess-webjars

    静态资源映射基本规则

    java
      // localhost:8080/
      // 如果访问映射的路径是 staticPathPattern = "/**";
      // this.resourceProperties.getStaticLocations())
      if (!registry.hasMappingForPattern(staticPathPattern)) {
        customizeResourceHandlerRegistration(registry.addResourceHandler("/**")
                         
    .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLoca
    tions()))
                         
    .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
     }
    如图尝试点源码的步骤,
    addResourceHandlers2
    addResourceHandler3
    addResourceHandler4
    addResourceHandlers5
    得到一个结论
    java
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS =
    {
    "classpath:/META-INF/resources/", // 在 starter 中使用! SWAGGER-UI
    "classpath:/resources/",  // 文件资源
    "classpath:/static/",   // 静态资源
    "classpath:/public/"    // 公共的,图标......
    };

    总结

  • 我们如果配置了自己的资源映射目录,一切原来的配置就是失效!
  • 一旦自己定义了静态文件夹的路径!就使用自己的即可!
文章作者: minghui
文章链接: https://dakuzai.ml/2020/03/23/%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E5%A4%84%E7%90%86%E5%8F%8Awebjars%E7%90%86%E8%A7%A3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dakuzai’s Blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论