使用 Spring MVC 提供 Web 内容

本指南将引导您完成使用 Spring 创建“Hello, World”网站的过程。

您将构建什么

您将构建一个具有静态主页的应用程序,该应用程序还将接受以下 HTTP GET 请求:https://127.0.0.1:8080/greeting

它将响应一个显示 HTML 的网页。HTML 的正文将包含问候语:“Hello, World!”

您可以使用查询字符串中的可选name参数自定义问候语。然后 URL 可能是https://127.0.0.1:8080/greeting?name=User

name参数值将覆盖World的默认值,并通过将内容更改为“Hello, User!”反映在响应中。

您需要什么

如何完成本指南

与大多数 Spring 入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到可运行的代码。

从头开始,请继续进行从 Spring Initializr 开始

跳过基础步骤,请执行以下操作

完成后,您可以将您的结果与gs-serving-web-content/complete中的代码进行比较。

从 Spring Initializr 开始

您可以使用此预初始化项目并单击“生成”以下载 ZIP 文件。此项目已配置为适合本教程中的示例。

手动初始化项目

  1. 导航到https://start.spring.io。此服务将引入应用程序所需的所有依赖项,并为您完成大部分设置工作。

  2. 选择 Gradle 或 Maven 以及您要使用的语言。本指南假设您选择了 Java。

  3. 单击依赖项并选择Spring WebThymeleafSpring Boot DevTools

  4. 单击生成

  5. 下载生成的 ZIP 文件,它是使用您的选择配置的 Web 应用程序的存档。

如果您的 IDE 集成了 Spring Initializr,则可以从您的 IDE 中完成此过程。
您也可以从 Github 分叉项目并在您的 IDE 或其他编辑器中打开它。

创建 Web 控制器

在 Spring 构建网站的方法中,HTTP 请求由控制器处理。您可以通过@Controller注解轻松识别控制器。在下面的示例中,GreetingController通过返回View的名称(在本例中为greeting)来处理/greeting的 GET 请求。View负责呈现 HTML 内容。以下列表(来自src/main/java/com/example/servingwebcontent/GreetingController.java)显示了控制器

package com.example.servingwebcontent;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class GreetingController {

	@GetMapping("/greeting")
	public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
		model.addAttribute("name", name);
		return "greeting";
	}

}

此控制器简洁明了,但其中有很多内容。我们将逐步分解它。

@GetMapping注解确保将对/greeting的 HTTP GET 请求映射到greeting()方法。

@RequestParam将查询字符串参数name的值绑定到greeting()方法的name参数。此查询字符串参数不是必需的。如果请求中不存在,则使用defaultValueWorldname参数的值将添加到Model对象,最终使其可供视图模板访问。

方法体实现依赖于视图技术(在本例中为Thymeleaf)来执行 HTML 的服务器端渲染。Thymeleaf 解析greeting.html模板并计算th:text表达式以呈现已在控制器中设置的${name}参数的值。以下列表(来自src/main/resources/templates/greeting.html)显示了greeting.html模板

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head> 
    <title>Getting Started: Serving Web Content</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p th:text="|Hello, ${name}!|" />
</body>
</html>
确保您的类路径上有 Thymeleaf(构件坐标:org.springframework.boot:spring-boot-starter-thymeleaf)。它已经在 Github 的“initial”和“complete”示例中。

Spring Boot Devtools

开发 Web 应用程序的一个常见特性是编写更改,重新启动应用程序,然后刷新浏览器以查看更改。整个过程可能会占用大量时间。为了加快此刷新周期,Spring Boot 提供了一个名为spring-boot-devtools的便捷模块。Spring Boot Devtools

  • 启用热交换

  • 切换模板引擎以禁用缓存。

  • 启用 LiveReload 以自动刷新浏览器。

  • 基于开发而不是生产的其他合理的默认值。

运行应用程序

Spring Initializr 为您创建了一个应用程序类。在本例中,您无需进一步修改 Spring Initializr 提供的类。以下列表(来自src/main/java/com/example/servingwebcontent/ServingWebContentApplication.java)显示了应用程序类

package com.example.servingwebcontent;

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

@SpringBootApplication
public class ServingWebContentApplication {

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

}

@SpringBootApplication是一个便利注解,它添加了以下所有内容

  • @Configuration:将类标记为应用程序上下文的 bean 定义的来源。

  • @EnableAutoConfiguration:告诉 Spring Boot 根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果spring-webmvc位于类路径中,则此注解将应用程序标记为 Web 应用程序并激活关键行为,例如设置DispatcherServlet

  • @ComponentScan:告诉 Spring 在com/example包中查找其他组件、配置和服务,使其能够找到控制器。

main()方法使用 Spring Boot 的SpringApplication.run()方法启动应用程序。您是否注意到没有一行 XML?也没有web.xml文件。此 Web 应用程序是 100% 纯 Java,您无需处理任何管道或基础设施的配置。

构建可执行 JAR

您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必要依赖项、类和资源的单个可执行 JAR 文件并运行它。构建可执行 jar 使得在整个开发生命周期中、跨不同环境等轻松地交付、版本化和部署服务作为应用程序。

如果您使用 Gradle,则可以使用./gradlew bootRun运行应用程序。或者,您可以使用./gradlew build构建 JAR 文件,然后运行 JAR 文件,如下所示

java -jar build/libs/gs-serving-web-content-0.1.0.jar

如果您使用 Maven,则可以使用./mvnw spring-boot:run运行应用程序。或者,您可以使用./mvnw clean package构建 JAR 文件,然后运行 JAR 文件,如下所示

java -jar target/gs-serving-web-content-0.1.0.jar
此处描述的步骤将创建一个可运行的 JAR。您还可以构建经典的 WAR 文件

将显示日志输出。应用程序应该在几秒钟内启动并运行。

测试应用程序

现在网站正在运行,请访问https://127.0.0.1:8080/greeting,您应该会看到“Hello, World!”

通过访问https://127.0.0.1:8080/greeting?name=User提供name查询字符串参数。注意消息如何从“Hello, World!”更改为“Hello, User!”

此更改演示了GreetingController中的@RequestParam安排按预期工作。name参数已赋予默认值World,但可以通过查询字符串显式覆盖。

添加主页

静态资源(包括 HTML、JavaScript 和 CSS)可以通过将其放入源代码的正确位置来从您的 Spring Boot 应用程序提供服务。默认情况下,Spring Boot 从类路径中/static(或/public)的资源提供静态内容。index.html资源是特殊的,因为如果它存在,它将用作“欢迎页面”,这意味着它将作为根资源提供服务(即在https://127.0.0.1:8080/)。因此,您需要创建以下文件(您可以在src/main/resources/static/index.html中找到它)

<!DOCTYPE HTML>
<html>
<head> 
    <title>Getting Started: Serving Web Content</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p>Get your greeting <a href="/greeting">here</a></p>
</body>
</html>

重新启动应用程序后,您将在https://127.0.0.1:8080/看到 HTML。

总结

恭喜!您刚刚使用 Spring 开发了一个网页。

另请参阅

以下指南也可能对您有所帮助

想撰写新的指南或为现有指南贡献力量?请查看我们的贡献指南

所有指南的代码均采用ASLv2许可证发布,文字内容则采用署名-非商业性使用-禁止演绎创作共享许可协议

获取代码