ZetCode

Spring Boot 自动控制器

最后修改于 2023 年 7 月 29 日

在本文中,我们将展示如何使用 ViewControllerRegistry 在 Spring Boot 应用程序中创建简单的自动控制器。 我们的应用程序显示一个简单的页面,该页面显示当前日期。 我们使用 FreeMarker 作为模板引擎。

Spring 是一个流行的 Java 应用程序框架。 Spring Boot 旨在创建独立的、生产级的基于 Spring 的应用程序,而无需太多麻烦。

FreeMarker 是一个用于 Web 和独立环境的服务器端 Java 模板引擎。 模板用 FreeMarker 模板语言 (FTL) 编写,它是一种简单、专业的语言。

ViewControllerRegistry

有时我们不需要复杂的控制器逻辑,只想返回一个视图。 ViewControllerRegistry 注册简单的自动控制器,这些控制器预先配置了状态码和/或视图。 它的 addViewController 方法将视图控制器映射到给定的 URL 路径(或模式),以便使用预配置的状态码和视图呈现响应。

build.gradle
...
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           └───config
│   │                   MvcConfig.java
│   └───resources
│       └───templates
│               index.ftlh
└───test
    └───java
        └───com
            └───zetcode
                    HomePageTest.java

这是项目结构。 FreeMarker 模板文件具有 .ftlh 后缀; 它们默认位于 resources/templates 目录中。

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

group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

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

}

test {
    useJUnitPlatform()
}

spring-boot-starter-freemarker 是使用 FreeMarker 构建 Spring MVC 应用程序的启动器。 spring-boot-starter-test 导入必要的测试模块。 应用程序被打包成 JAR 文件。

com/zetcode/config/MvcConfig.java
package com.zetcode.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }
}

MvcConfig 类中,我们为首页配置一个视图和一个控制器。 index 视图被映射到 index.ftlh 模板文件,该文件位于 src/main/resources/templates 目录中。

resources/templates/index.ftlh
<#assign now = .now>
<!DOCTYPE html>
<html>
    <head>
        <title>Home page</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <p>Today is: ${now?string.short}</p>
    </body>
</html>

index.ftlh 模板文件是应用程序的首页。 它显示当前日期。

<#assign now = .now>

在这里,我们将当前日期时间值分配给 now 变量。

<p>Today is: ${now?string.short}</p>

我们以短格式打印日期。

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

我们设置Spring Boot应用程序。 @SpringBootApplication 注解启用自动配置和组件扫描。

com/zetcode/HomePageTest.java
package com.zetcode;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@SpringBootTest
public class HomePageTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @BeforeEach
    public void setUp() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testHomePage() throws Exception {
        this.mockMvc.perform(MockMvcRequestBuilders.get("/"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.view().name("index"))
                .andDo(MockMvcResultHandlers.print());
    }
}

这是首页的测试。

$ ./gradlew bootRun

我们启动应用程序。

$ curl localhost:8080
<!DOCTYPE html>
<html>
    <head>
        <title>Home page</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <p>Today is: 7/18/23, 1:47 PM</p>
    </body>
</html>

使用 curl 工具,我们检索首页。

在本文中,我们创建了一个简单的控制器和视图,没有创建特定的控制器类。 我们使用了 FreeMarker 作为模板引擎。

作者

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

列出 所有 Spring Boot 教程