pom.xml
:
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.2version>
parent>
<packaging>jarpackaging>
<groupId>com.kavengroupId>
<artifactId>springbootartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>springbootname>
<description>springbootdescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
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";
}
}
<!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.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
<resources>
<resource>
<directory>src/main/my-resourcesdirectory>
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
操作,再重新启动应用。
这篇博客就到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。