使用 Spring MVC 提供 Web 內容

本指南將引導您完成使用 Spring 建立“Hello, World”網站的過程。

您將構建什麼

您將構建一個擁有靜態主頁的應用程式,該應用程式還將接受對 https://:8080/greeting 的 HTTP GET 請求。

它將響應一個顯示 HTML 的網頁。HTML 的正文將包含一個問候語:“Hello, World!”

您可以使用查詢字串中的可選 name 引數自定義問候語。URL 可能是 https://: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 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。如果請求中不存在,則使用 WorlddefaultValuename 引數的值被新增到 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(artifact 座標: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://:8080/greeting,您應該會看到“Hello, World!”

透過訪問 https://: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://: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://:8080/ 看到 HTML。

總結

恭喜!您剛剛使用 Spring 開發了一個網頁。

另請參閱

以下指南也可能有所幫助

想寫新指南或為現有指南做貢獻嗎?請檢視我們的貢獻指南

所有指南的程式碼均採用 ASLv2 許可,文字內容採用署名-禁止演繹知識共享許可

獲取程式碼