Spring Boot:静态资源

测试代码

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";
    }
}

静态资源如下图所示:
Spring Boot:静态资源_第1张图片
都是类似如下所示的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:静态资源_第2张图片

静态资源默认目录

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

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

静态资源优先顺序

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

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

Spring Boot:静态资源_第5张图片
执行同样的操作。

Spring Boot:静态资源_第6张图片
Spring Boot:静态资源_第7张图片
可见静态资源默认目录的优先顺序为:

  • /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:静态资源_第8张图片

自定义静态资源位置

可以使用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:静态资源_第9张图片
Spring Boot:静态资源_第10张图片
配置中自定义静态资源位置的先后顺序就是静态资源的优先顺序。

自定义静态资源文件夹

修改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>

Spring Boot:静态资源_第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:静态资源_第12张图片
启动应用,日志如下图所示,说明新的配置文件起作用了。
Spring Boot:静态资源_第13张图片
使用Postman访问http://127.0.0.1:8085/static/index
Spring Boot:静态资源_第14张图片
如果存在resources文件夹,Spring Boot默认使用该文件夹下的静态资源,包括配置文件。
Spring Boot:静态资源_第15张图片
启动应用,日志如下图所示,说明resources文件夹下的配置文件起作用了。
Spring Boot:静态资源_第16张图片
使用Postman访问http://127.0.0.1:8085/static/index,也是访问到resources文件夹下的静态资源。
Spring Boot:静态资源_第17张图片
因此需要修改resources文件夹的名称或者直接删除掉,如果自定义静态资源文件夹还是没有起作用,就需要使用Maven执行clean操作,再重新启动应用。
Spring Boot:静态资源_第18张图片
这篇博客就到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。

你可能感兴趣的:(Spring,Boot,spring,boot,java,spring)