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
目录中。
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 文件。
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
目录中。
<#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>
我们以短格式打印日期。
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
注解启用自动配置和组件扫描。
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 作为模板引擎。