0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍一下单体应用中Spring Boot对静态资源的一些映射规则

冬至子 来源:瑞煕share 作者:brevity wit 2023-06-02 11:02 次阅读

在实际项目开发中,除了程序代码外,还需要一些静态资源,比如公司logo,背景图,css样式文件,js文件等等,这里介绍一下单体应用中Spring Boot对静态资源的一些映射规则。(此处的单体应用指非前后端分离、非微服务、非SOA架构的简易版项目,具体区别看下图所示)

图片

Spring Boot对静态资源的映射规则

在Spring Boot中,SpringMVC的相关配置都默认在WebMvcAutoConfiguration类中,具体源码请在IDE中自行搜索查看。

1、 所有/webjars/**(/**表示访问此路径下的任何资源,都会去classpath:/META-INF/resources/webjars/下寻找资源(webjars就是以jar包方式引入资源到项目中), 相关源码如下:

// WebMvcAutoConfiguration.java
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
   if (!this.resourceProperties.isAddMappings()) {
      logger.debug("Default resource handling disabled");
      return;
   }
   addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
   addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) - > {
      registration.addResourceLocations(this.resourceProperties.getStaticLocations());
      if (this.servletContext != null) {
         ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
         registration.addResourceLocations(resource);
      }
   });
}
private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, String... locations) {
   addResourceHandler(registry, pattern, (registration) - > registration.addResourceLocations(locations));
}
private void addResourceHandler(ResourceHandlerRegistry registry, String pattern,
      Consumer< ResourceHandlerRegistration > customizer) {
   if (registry.hasMappingForPattern(pattern)) {
      return;
   }
   ResourceHandlerRegistration registration = registry.addResourceHandler(pattern);
   customizer.accept(registration);
   registration.setCachePeriod(getSeconds(this.resourceProperties.getCache().getPeriod()));
   registration.setCacheControl(this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl());
   registration.setUseLastModified(this.resourceProperties.getCache().isUseLastModified());
   customizeResourceHandlerRegistration(registration);
}

结构如图所示(以jquery为例):

1.jpg

jquery的maven依赖如下:

< dependency >
    < groupId >org.webjars.npm< /groupId >
    < artifactId >jquery< /artifactId >
    < version >3.6.0< /version >
< /dependency >

访问示例地址如下:

localhost:8080/webjars/jquery/3.6.0/dist/jquery.js

访问结果如下图所示:

图片

2、 /**,访问当前项目下的任何静态资源,相关源码如下:

// WebMvcAutoConfiguration.java
addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) - > {
   registration.addResourceLocations(this.resourceProperties.getStaticLocations());
   if (this.servletContext != null) {
      ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
      registration.addResourceLocations(resource);
   }
});


// WebMvcProperties.java
public String getStaticPathPattern() {
   return this.staticPathPattern;
}
private String staticPathPattern = "/**";


// WebProperties.java
public String[] getStaticLocations() {
   return this.staticLocations;
}
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
      "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
/**
 * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
 * /resources/, /static/, /public/].
 */
private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;

由源码可知,静态资源的访问路径有如下几个:

1、classpath:/META-INF/resources/ ;

2、classpath:/resources/;

3、classpath:/static/;

4、classpath:/public/;

5、/ (当前项目的根路径)。

如下图所示:

1.jpg

**3、 **欢迎页: 静态资源文件夹下的index.html页面,相关源码如下:

// WebMvcAutoConfiguration.java

@Bean

public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,

FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {

WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(

new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),

this.mvcProperties.getStaticPathPattern());

welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));

welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());

return welcomePageHandlerMapping;

}

private Resource getWelcomePage() {

for (String location : this.resourceProperties.getStaticLocations()) {

Resource indexHtml = getIndexHtml(location);

if (indexHtml != null) {

return indexHtml;

}

}

ServletContext servletContext = getServletContext();

if (servletContext != null) {

return getIndexHtml(new ServletContextResource(servletContext, SERVLET_LOCATION));

}

return null;

}

private Resource getIndexHtml(String location) {

return getIndexHtml(this.resourceLoader.getResource(location));

}

private Resource getIndexHtml(Resource location) {

try {

Resource resource = location.createRelative("index.html");

if (resource.exists() && (resource.getURL() != null)) {

return resource;

}

}

catch (Exception ex) {

}

return null;

}

// WebMvcProperties.java

public String getStaticPathPattern() {

return this.staticPathPattern;

}

private String staticPathPattern = "/**";

根据源码可知,欢迎页是被/**映射,也解释了首页名称为index.html的原因。

4、 自定义静态资源文件夹,在配置文件application.properties中添加如下配置,就会覆盖掉项目的默认配置,示例代码如下:

spring.web.resources.static-locations=classpath:/brevity/,classpath:/github/

以上就是Spring Boot单体应用中关于静态资源映射的说明。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CSS
    CSS
    +关注

    关注

    0

    文章

    104

    浏览量

    14185
  • MVC
    MVC
    +关注

    关注

    0

    文章

    73

    浏览量

    13783
  • SOA技术
    +关注

    关注

    0

    文章

    4

    浏览量

    5551
收藏 人收藏

    评论

    相关推荐

    介绍一些简单的项目

    学51单片机已经个多月,简单的操作感觉还好。 想找一些简单的项目做一下,在项目中学习,求介绍一些项目,谢谢。PS:以后想往Linux嵌入式
    发表于 08-18 12:35

    介绍一下labview机器视觉怎么实现一些零件尺寸的测量。

    美化并二次编程。具体步骤有兴趣的可以去试试。有个文档分享不了,大家可以百度一下NI Vision Assistant中文入门教程,里面介绍相对详细。,更新一下视觉的一些教程。
    发表于 03-12 16:36

    Spring bootRedis的使用

    【本人秃顶程序员】springboot专辑:Spring bootRedis的使用
    发表于 03-27 11:42

    启动Spring Boot项目应用的三种方法

    来启动。如下图所示。第三种、java命令jar文件启动。首先回到项目文件夹把这个项目编译一下:mvn install,编译完成后切换到target目录:cd target,发现多了个jar后缀
    发表于 01-14 17:33

    介绍一下UPS的一些基础知识

    机房UPS电源实际负载容量与负载量是怎么计算的?2018-09-16正文:、首先介绍一下UPS的一些基础知识1、为什么用UPS?UPS的作用是什么?至于为什么用UPS?就是为了不停电
    发表于 11-16 07:16

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目标是构建“非常容易创建、独立、产品级别的基于Spring的应用”。这些应
    发表于 12-16 07:57

    介绍一下机电暂态开源工具使用过程一些体会

    )作者:一一数二三这个工具箱所有代码开源,且提供了图形化仿真界面,单元模块化,易于添加新的模块和仿真器件。介绍一下我使用过程一些体会:负荷使用ZIP模型,注入负荷电流到输电网络的过
    发表于 12-30 08:33

    Spring Boot从零入门1 详述

    在开始学习Spring Boot之前,我之前从未接触过Spring相关的项目,Java基础还是几年前自学的,现在估计也忘得差不多了吧,写Spring
    的头像 发表于 12-10 22:18 419次阅读

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验
    的头像 发表于 09-29 10:24 646次阅读

    Spring Boot Web相关的基础知识

    Boot的第一个接口。接下来将会将会介绍使用Spring Boot开发Web应用的相关内容,其主要包括使用spring-boot-star
    的头像 发表于 03-17 15:03 462次阅读

    Spring Boot中如何使用定时任务

    本文介绍Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了。
    的头像 发表于 04-12 10:56 782次阅读

    Spring Boot静态资源映射规则

    在实际项目开发中,除了程序代码外,还需要一些静态资源,比如公司logo,背景图,css样式文件,js文件等等
    的头像 发表于 06-02 10:04 718次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>对<b class='flag-5'>静态</b><b class='flag-5'>资源</b>的<b class='flag-5'>映射</b><b class='flag-5'>规则</b>

    Spring Boot Actuator快速入门

    一下 Spring Boot Actuator ,学习如何在 Spring Boot 2.x 中使用、配置和扩展这个监控工具。
    的头像 发表于 10-09 17:11 344次阅读

    Spring Boot的启动原理

    来指定依赖,才能够运行。我们今天就来分析讲解一下 Spring Boot 的启动原理。 1. Spring Boot 打包插件
    的头像 发表于 10-13 11:44 372次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的启动原理

    Spring Boot 的设计目标

    Spring 框架复杂的XML配置。使用 Spring Boot 可以很容易创建一个独立运行的、基于 Spring 的生产级应用程序,而且Spri
    的头像 发表于 10-13 14:56 313次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的设计目标