测试代码

​pom.xml​​:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
</parent>

<packaging>jar</packaging>

<groupId>com.kaven</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>

<name>springboot</name>
<description>springboot</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

启动类:

package com.kaven.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootApplication {

public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringbootApplication.class);
application.run(args);
}
}

用于访问静态资源的接口:

package com.kaven.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {

@GetMapping("/index")
public String index() {
return "index.html";
}
}

静态资源如下图所示:

Spring Boot:静态资源_spring


都是类似如下所示的​​HTML​​代码。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ITKaven</title>
</head>
<body>
<h1>/META-INF/resources</h1>
</body>
</html>

Spring Boot:静态资源_java_02

静态资源默认目录

默认情况下,​​Spring Boot​​​从类路径中名为​​/static​​​、​​/public​​​、​​/resources​​​、​​/META-INF/resources​​​的目录或​​ServletContext​​​的根目录提供静态资源,使用​​Spring MVC​​​中的​​ResourceHttpRequestHandler​​​来进行处理,可以通过添加自己的​​WebMvcConfigurer​​​并重写​​addResourceHandlers​​方法来修改该配置。

Spring Boot:静态资源_java_03


在一个独立的​​Web​​​应用程序中,容器中的默认​​servlet​​​也会被启用,并充当后备服务,如果​​Spring​​​对静态资源请求不进行处理,则会从​​ServletContext​​​的根目录提供静态资源。大多数情况下,这种情况不会发生(除非修改默认的​​MVC​​​配置),因为​​Spring​​​总是可以通过​​DispatcherServlet​​处理请求。

静态资源优先顺序

当默认目录存在同名的静态资源(比如​​HTML​​​页面)时,访问该同名静态资源会存在优先顺序,启动应用,使用​​Postman​​​访问​​http://localhost:8080/index​​。

Spring Boot:静态资源_静态资源_04


可见​​/META-INF/resources​​​文件夹下的静态资源最先被访问到,修改该文件夹的名称,重新启动应用,使用​​Postman​​​再访问​​http://localhost:8080/index​​。

Spring Boot:静态资源_静态资源_05


执行同样的操作。

Spring Boot:静态资源_html_06


Spring Boot:静态资源_spring_07


可见静态资源默认目录的优先顺序为:

  • ​/META-INF/resources​
  • ​/resources​
  • ​/static​
  • ​/public​

为了不影响后面的测试,将所有文件夹修改成原来的名称。

静态资源请求路径模式

默认情况下,静态资源的请求路径模式为​​/**​​​(即所有请求路径),可以使用​​spring.mvc.static-path-pattern​​属性对其进行设置。

​application.properties​​:

spring.mvc.static-path-pattern=/static/**

修改控制器:

package com.kaven.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/static")
public class IndexController {

@GetMapping("/index")
public String index() {
return "index.html";
}
}

​spring.mvc.static-path-pattern=/static/**​​​表示当请求路径匹配​​/static/**​​​时,才会处理该获取静态资源的请求,比如访问​​http://127.0.0.1:8080/static/index​​。

Spring Boot:静态资源_spring boot_08

自定义静态资源位置

可以使用​​spring.web.resources.static-locations​​​属性自定义静态资源的位置(会将默认值覆盖),根​​servlet​​​ 上下文路径​​"/"​​也会自动添加到该位置集合。

​application.properties​​:

spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/html,classpath:/my

Spring Boot:静态资源_spring boot_09


Spring Boot:静态资源_静态资源_10


配置中自定义静态资源位置的先后顺序就是静态资源的优先顺序。

自定义静态资源文件夹

修改​​pom.xml​​:

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/my-resources</directory>
</resource>
</resources>
</build>

Spring Boot:静态资源_html_11

​my-resources​​​文件夹下的配置文件​​application.properties​​:

server.port=8085
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/html,classpath:/my

​my-resources​​文件夹下的静态资源。

Spring Boot:静态资源_spring_12


启动应用,日志如下图所示,说明新的配置文件起作用了。

Spring Boot:静态资源_java_13


使用​​Postman​​​访问​​http://127.0.0.1:8085/static/index​​。

Spring Boot:静态资源_静态资源_14


如果存在​​resources​​​文件夹,​​Spring Boot​​默认使用该文件夹下的静态资源,包括配置文件。

Spring Boot:静态资源_java_15


启动应用,日志如下图所示,说明​​resources​​文件夹下的配置文件起作用了。

Spring Boot:静态资源_静态资源_16


使用​​Postman​​​访问​​http://127.0.0.1:8085/static/index​​​,也是访问到​​resources​​文件夹下的静态资源。

Spring Boot:静态资源_spring_17


因此需要修改​​resources​​​文件夹的名称或者直接删除掉,如果自定义静态资源文件夹还是没有起作用,就需要使用​​Maven​​​执行​​clean​​操作,再重新启动应用。

Spring Boot:静态资源_spring_18


这篇博客就到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。