ZetCode

在 Spring Boot 中提供静态内容

最后修改时间:2023年7月20日

Spring Boot 静态内容展示了如何在 Spring Boot 应用程序中提供静态内容。

Spring 是一个流行的 Java 应用程序框架。Spring Boot 旨在以最小的努力创建独立的、生产级的基于 Spring 的应用程序。

Spring Boot 会自动添加位于以下任何目录中的静态 Web 资源

这些目录位于类路径或 ServletContext 的根目录下。

在我们的应用程序中,我们有一个 HTML 文件,其中包含一个简单的链接。该链接触发了 Web Boot 应用程序的响应。它返回一条纯文本消息。

build.gradle
...
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           ├───controller
│   │           │       MyController.java
│   │           └───model
│   │                   Message.java
│   └───resources
│       │   application.properties
│       └───static
│           │   index.html
│           └───css
│                   main.css
└───test
    └───java
        └───com
            └───zetcode
                └───controller
                        MyControllerTest.java

这是 Spring Boot 应用程序的项目结构。

build.gradle
plugins {
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

这是 gradle 构建文件。spring-boot-starter-web 是使用 Spring MVC 构建 Web 应用程序的启动器。spring-boot-starter-test 导入必要的测试模块。

com/zetcode/model/Message.java
package com.zetcode.model;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Message {

    @Value("${app.message}")
    private String message;

    public String get() {
        return message;
    }
}

Message 是一个模型类,它包含一个简单的文本消息给客户端。

@Value("${app.message}")
private String message;

我们将来自 application.properties 的一个值注入到 message 变量中。

resources/application.properties
app.message=Hello there

application.properties 文件包含 Spring Boot 应用程序的各种配置设置。我们定义一个自定义属性,其中包含一个文本消息。

com/zetcode/controller/MyController.java
package com.zetcode.controller;

import com.zetcode.model.Message;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    private final Message message;

    public MyController(Message message) {
        this.message = message;
    }

    @GetMapping(path = "/message")
    @ResponseBody
    public String message() {

        return message.get();
    }
}

这是 Spring Boot Web 应用程序的控制器类。控制器使用 @Controller 注解进行修饰。控制器有一个映射;它映射到 /message 路径并返回一条纯文本消息。

private final Message message;

public MyController(Message message) {
    this.message = message;
}

一个 Message 对象被注入到该属性中。

@GetMapping(path = "/message")
@ResponseBody
public String message() {

    return message.get();
}

message 方法响应 GET 请求。@ResponseBody 注解将字符串值放入 Web 响应体中。

resources/static/index.html
<!DOCTYPE html>
<html>
<head>
    <title>Home page</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="css/main.css" rel="stylesheet" type="text/css">
</head>
<body>

<h2>Home page</h2>

<a href="/message">Get message</a>
</body>
</html>

index.html 文件中,我们有一个链接,它会调用来自 Web 应用程序的响应。该文件位于 src/main/resources/static 目录中,该目录是 Spring 查找静态内容的默认目录。

<link href="css/main.css" rel="stylesheet" type="text/css">

在链接标签中,我们引用了 main.css 静态资源,它位于 src/main/resources/static/css 目录中。

resources/static/css/main.css
h2 { color: blue }

main.css 文件中,我们将 h2 标签设置为蓝色。

com/zetcode/controller/MyControllerTest.java
package com.zetcode.controller;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void getHome() throws Exception {
        this.mockMvc.perform(get("/"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(forwardedUrl("index.html"));
    }

    @Test
    public void getMessage() throws Exception {
        this.mockMvc.perform(get("/message"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string("Hello there"));
    }
}

MyControllerTest 中,我们有两个测试:一个用于主页,一个用于返回的消息文本。

com/zetcode/Application.java
package com.zetcode;

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

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

`Application` 设置了 Spring Boot 应用程序。

在本文中,我们已经在 Spring Boot 应用程序中提供了静态内容。

作者

我叫 Jan Bodnar,是一个充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 Spring Boot 教程