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

您可以使用這個 預先初始化的專案,然後按一下「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 分叉專案,並在您的 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(成品座標: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 授權發佈程式碼,並以 姓名標示-禁止改作創用 CC 授權 發佈寫作內容。

取得程式碼