使用 Spring MVC 提供 Web 内容

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

您将构建什么

您将构建一个应用程序,它有一个静态主页,并且还将接受对 http://localhost:8080/greeting 的 HTTP GET 请求。

它将返回一个显示 HTML 的网页。HTML 的主体将包含一个问候语:“Hello, World!”

您可以使用查询字符串中的可选 name 参数来自定义问候语。此时的 URL 可能是 http://localhost:8080/greeting?name=User

name 参数值会覆盖 World 的默认值,并在响应中反映出来,内容变为“Hello, User!”

您需要什么

如何完成本指南

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

从头开始,请继续阅读从 Spring Initializr 开始

跳过基础部分,请执行以下操作

完成后,您可以对照 gs-serving-web-content/complete 中的代码检查结果。

从 Spring Initializr 开始

您可以使用这个预初始化的项目,然后点击 Generate 下载 ZIP 文件。这个项目已经配置好,适合本教程中的示例。

手动初始化项目

  1. 导航到https://start.spring.io。这个服务会拉取应用程序所需的所有依赖,并为您完成大部分设置。

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

  3. 点击 Dependencies 并选择 Spring WebThymeleafSpring Boot DevTools

  4. 点击 Generate

  5. 下载生成的 ZIP 文件,这是一个根据您的选择配置好的 web 应用程序的压缩包。

如果您的 IDE 集成了 Spring Initializr,您可以直接在 IDE 中完成此过程。
您也可以从 Github fork 该项目,并在您的 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 参数。此查询字符串参数不是 required(必需的)。如果在请求中缺失,则使用 WorlddefaultValue(默认值)。name 参数的值被添加到 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 文件

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

测试应用程序

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

通过访问 http://localhost:8080/greeting?name=User 提供一个 name 查询字符串参数。请注意消息如何从“Hello, World!”变为“Hello, User!”

这个变化表明 GreetingController 中的 @RequestParam 配置按预期工作。name 参数被赋予了默认值 World,但可以通过查询字符串显式覆盖它。

添加主页

静态资源,包括 HTML、JavaScript 和 CSS,可以通过将其放入源代码中的正确位置来从 Spring Boot 应用程序提供服务。默认情况下,Spring Boot 从类路径中 /static(或 /public)下的资源提供静态内容。index.html 资源很特别,因为如果它存在,它将被用作“欢迎页面”,这意味着它将作为根资源提供服务(即在 http://localhost: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>

重启应用程序后,您将在 http://localhost:8080/ 看到 HTML。

总结

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

另请参阅

以下指南也可能有所帮助

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

所有指南的代码均采用 ASLv2 许可证发布,文字内容采用 署名-禁止演绎 (Attribution, NoDerivatives) Creative Commons 许可证

获取代码