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

    文章

    109

    浏览量

    14346
  • MVC
    MVC
    +关注

    关注

    0

    文章

    73

    浏览量

    13837
  • SOA技术
    +关注

    关注

    0

    文章

    4

    浏览量

    5574
收藏 人收藏

    评论

    相关推荐

    Spring BootDocker的入门指南()

    许多人使用容器来包装他们的 Spring Boot 应用程序,而构建容器并不是件简单的事情。这是针对 Spring Boot 应用程序开发
    的头像 发表于 06-28 15:54 2642次阅读

    Spring Boot虚拟线程和Webflux性能对比

    早上看到篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,
    发表于 09-24 14:54 848次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>虚拟线程和Webflux性能对比

    Spring Boot Starter需要什么

    pulsar-spring-boot-starter是非常有必要的,在此之前,我们先看看个starter需要什么。 Spring Boot
    的头像 发表于 09-25 11:35 722次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> Starter需要<b class='flag-5'>些</b>什么

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

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

    PCB布板一些简易常用规则

    PCB布板一些简易常用规则   这几天还是关注一些简单入门的东西吧,主要介绍一些PCB中
    发表于 11-21 14:34 6616次阅读

    Spring Boot特有的实践

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

    Spring Boot Web相关的基础知识

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

    简述Spring Boot数据校验

    篇文章我们了解了Spring Boot Web相关的知识,初步了解了spring-boot-starter-web,还了解了@Contrler和@RestController的差别
    的头像 发表于 03-17 15:07 730次阅读

    Spring Boot如何使用定时任务

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

    Spring Boot静态资源映射规则

    在实际项目开发,除了程序代码外,还需要一些静态资源,比如公司logo,背景图,css样式文件,js文件等等
    的头像 发表于 06-02 10:04 947次阅读
    <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 598次阅读

    Spring Boot启动 Eureka流程

    在上篇已经说过了 Eureka-Server 本质上是个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。
    的头像 发表于 10-10 11:40 843次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>启动 Eureka流程

    Spring Boot的启动原理

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

    Spring Boot 的设计目标

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

    Spring Boot 3.2支持虚拟线程和原生镜像

    Spring Boot 3.2 前几日发布,让我们用 Java 21、GraalVM 和虚拟线程来尝试一下
    的头像 发表于 11-30 16:22 678次阅读