使用 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 開始

您可以使用這個預初始化的專案,然後點選 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 檔案

將顯示日誌輸出。應用程式應在幾秒鐘內啟動並執行。

測試應用程式

現在網站正在執行,訪問 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 許可證釋出,文字內容採用 署名-禁止演繹 (Attribution, NoDerivatives) Creative Commons 許可證

獲取程式碼