测试代码
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";
}
}
静态资源如下图所示:
都是类似如下所示的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
从类路径中名为/static
、/public
、/resources
、/META-INF/resources
的目录或ServletContext
的根目录提供静态资源,使用Spring MVC
中的ResourceHttpRequestHandler
来进行处理,可以通过添加自己的WebMvcConfigurer
并重写addResourceHandlers
方法来修改该配置。
在一个独立的Web
应用程序中,容器中的默认servlet
也会被启用,并充当后备服务,如果Spring
对静态资源请求不进行处理,则会从ServletContext
的根目录提供静态资源。大多数情况下,这种情况不会发生(除非修改默认的MVC
配置),因为Spring
总是可以通过DispatcherServlet
处理请求。
静态资源优先顺序
当默认目录存在同名的静态资源(比如HTML
页面)时,访问该同名静态资源会存在优先顺序,启动应用,使用Postman
访问http://localhost:8080/index
。
可见/META-INF/resources
文件夹下的静态资源最先被访问到,修改该文件夹的名称,重新启动应用,使用Postman
再访问http://localhost:8080/index
。
执行同样的操作。
可见静态资源默认目录的优先顺序为:
-
/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.web.resources.static-locations
属性自定义静态资源的位置(会将默认值覆盖),根servlet
上下文路径"/"
也会自动添加到该位置集合。
application.properties
:
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/html,classpath:/my
配置中自定义静态资源位置的先后顺序就是静态资源的优先顺序。
自定义静态资源文件夹
修改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>
my-resources
文件夹下的配置文件application.properties
:
server.port=8085
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/html,classpath:/my
my-resources
文件夹下的静态资源。
启动应用,日志如下图所示,说明新的配置文件起作用了。
使用Postman
访问http://127.0.0.1:8085/static/index
。
如果存在resources
文件夹,Spring Boot
默认使用该文件夹下的静态资源,包括配置文件。
启动应用,日志如下图所示,说明resources
文件夹下的配置文件起作用了。
使用Postman
访问http://127.0.0.1:8085/static/index
,也是访问到resources
文件夹下的静态资源。
因此需要修改resources
文件夹的名称或者直接删除掉,如果自定义静态资源文件夹还是没有起作用,就需要使用Maven
执行clean
操作,再重新启动应用。
这篇博客就到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。