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";
}
}
使用 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!”來反映在響應中。
你需要什麼
-
大約 15 分鐘
-
一個喜歡的文字編輯器或 IDE
-
Java 17 或更高版本
-
您還可以將程式碼直接匯入到您的 IDE 中
如何完成本指南
與大多數 Spring 入門指南一樣,您可以從頭開始並完成每個步驟,也可以跳過您已熟悉的基本設定步驟。無論哪種方式,您最終都會得到可工作的程式碼。
要從頭開始,請轉到從 Spring Initializr 開始。
要跳過基礎知識,請執行以下操作
-
下載並解壓本指南的源儲存庫,或使用 Git 克隆它:
git clone https://github.com/spring-guides/gs-serving-web-content.git -
cd 進入
gs-serving-web-content/initial -
跳到建立 Web 控制器。
完成時,您可以對照 gs-serving-web-content/complete 中的程式碼檢查您的結果。
從 Spring Initializr 開始
您可以使用這個預初始化專案,然後單擊“生成”下載 ZIP 檔案。此專案已配置為符合本教程中的示例。
手動初始化專案
-
導航到 https://start.spring.io。此服務會為您拉取應用程式所需的所有依賴項,併為您完成大部分設定。
-
選擇 Gradle 或 Maven 以及您想要使用的語言。本指南假設您選擇了 Java。
-
單擊依賴項並選擇 Spring Web、Thymeleaf 和 Spring Boot DevTools。
-
單擊生成。
-
下載生成的 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)顯示了控制器
這個控制器簡潔簡單,但其中有很多內容。我們一步一步地進行分解。
@GetMapping 註解確保將對 /greeting 的 HTTP GET 請求對映到 greeting() 方法。
@RequestParam 將查詢字串引數 name 的值繫結到 greeting() 方法的 name 引數中。此查詢字串引數不是 required。如果請求中不存在,則使用 World 的 defaultValue。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(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 檔案
如果您使用 Maven,您可以透過使用 ./mvnw spring-boot:run 執行應用程式。或者,您可以使用 ./mvnw clean package 構建 JAR 檔案,然後按如下方式執行 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 開發了一個網頁。