SpringBoot静态资源映射

开课吧开课吧锤锤2021-08-13 14:22

在Web应用中会涉及到大量的静态资源,例如JS、CSS和HTML等。我们知道,SpringMVC导入静态资源文件时,需要配置静态资源的映射;但在SpringBoot中则不再需要进行此项配置,因为SpringBoot已经默认完成了这一工作。  

SpringBoot静态资源映射

SpringBoot默认为我们提供了3种静态资源映射规则:  

WebJars映射  

默认资源映射  

静态首页(欢迎页)映射  

WebJars映射  

为了让页面更加美观,让用户有更多更好的体验,Web应用中通常会使用大量的JS和CSS,例如jQuery,Backbone.js和Bootstrap等等。通常我们会将这些Web前端资源拷贝到JavaWeb项目的webapp相应目录下进行管理。但是SpringBoot项目是以JAR包的形式进行部署的,不存在webapp目录,那么Web前端资源该如何引入到SpringBoot项目中呢?  

WebJars可以完美的解决上面的问题,它可以Jar形式为Web项目提供资源文件。  

WebJars可以将Web前端资源(JS,CSS等)打成一个个的Jar包,然后将这些Jar包部署到Maven中央仓库中进行统一管理,当SpringBoot项目中需要引入Web前端资源时,只需要访问WebJars官网,找到所需资源的pom依赖,将其导入到项目中即可。  

所有通过WebJars引入的前端资源都存放在当前项目类路径(classpath)下的“/META-INF/resources/webjars/”目录中。  

下图展示如何通过WebJars查找JQuery的pom依赖的过程。  

SpringBoot静态资源映射

SpringBoot通过MVC的自动配置类WebMvcAutoConfiguration为这些WebJars前端资源提供了默认映射规则,部分源码如下。  

public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (!this.resourceProperties.isAddMappings()) {
        logger.debug("Default resource handling disabled");
    } else {
        //WebJars 映射规则
        this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
        this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
            registration.addResourceLocations(this.resourceProperties.getStaticLocations());
            if (this.servletContext != null) {
                ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                registration.addResourceLocations(new Resource[]{resource});
            }
        });
    }
}

通过以上源码可知,WebJars的映射路径为“/webjars/**”,即所有访问“/webjars/**”的请求,都会去“classpath:/META-INF/resources/webjars/”查找WebJars前端资源。  

示例1  

1.在SpringBoot项目spring-boot-springmvc-demo1的pom.xml中添加以下依赖,将jquery引入到该项目中。  

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

2.SpringBoot项目中引入的jquery的Jar包结构如下图。  

SpringBoot静态资源映射

3.启动SpringBoot,浏览器访问“http://localhost:8080/webjars/jquery/3.6.0/jquery.js”访问jquery.js,结果如下图。 

SpringBoot静态资源映射

默认静态资源映射  

当访问项目中的任意资源(即“/**”)时,SpringBoot会默认从以下路径中查找资源文件(优先级依次降低):  

1、classpath:/META-INF/resources/  

2、classpath:/resources/  

3、classpath:/static/  

4、classpath:/public/  

这些路径又被称为静态资源文件夹,它们的优先级顺序为:classpath:/META-INF/resources/>classpath:/resources/>classpath:/static/>classpath:/public/。  

当我们请求某个静态资源(即以“.html”结尾的请求)时,SpringBoot会先查找优先级高的文件夹,再查找优先级低的文件夹,直到找到指定的静态资源为止。  

示例2  

1.在spring-boot-springmvc-demo1的src/main/resources下的static目录中创建一个hello.html,代码如下。  

<!DOCTYPE html>
<html lang="en">
<head></head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<body>
<h1>欢迎您来到开课吧(https://www.kaikeba.com/)</h1>
</body>
</html>

2.启动SpringBoot,浏览器访问“http://localhost:8080/hello.html”  

静态首页(欢迎页)映射  

静态资源文件夹下的所有index.html被称为静态首页或者欢迎页,它们会被被/**映射,换句话说就是,当我们访问“/”或者“/index.html”时,都会跳转到静态首页(欢迎页)。  

注意,访问静态首页或欢迎页时,其查找顺序也遵循默认静态资源的查找顺序,即先查找优先级高的目录,在查找优先级低的目录,直到找到index.html为止。  

示例3  

1.在spring-boot-springmvc-demo1的src/main/resources下的public目录中创建一个index.html,代码如下。  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>首页</h1>
</body>
</html>

2.启动SpringBoot,使用浏览器访问“http://localhost:8080/”,结果如下图。  

SpringBoot静态资源映射

以上就是开课吧广场小编为大家整理发布的“SpringBoot静态资源映射”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!

开课吧广场Java教程

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营