原标題:Spring認證指南|了解如何使用 Spring 建立和送出 Web 表單。

本指南将引導您完成使用 Spring 建立和送出 Web 表單的過程。
你将建造什麼
在本指南中,您将建構一個 Web 表單,可通過以下 URL 通路該表單:http://localhost:8080/greeting
在浏覽器中檢視此頁面将顯示表單。id您可以通過填充和content表單字段來送出問候語。送出表單時将顯示結果頁面。
你需要什麼
- 約15分鐘
- 最喜歡的文本編輯器或 IDE
- JDK 11或更高版本
- Gradle 4+或Maven 3.2+
- 您還可以将代碼直接導入 IDE:
- 彈簧工具套件 (STS)
- IntelliJ IDEA
如何完成本指南
像大多數 Spring入門指南一樣,您可以從頭開始并完成每個步驟,也可以繞過您已經熟悉的基本設定步驟。無論哪種方式,您最終都會得到工作代碼。
要從頭開始,請繼續從 Spring Initializr 開始。
要跳過基礎知識,請執行以下操作:
- 下載下傳并解壓本指南的源代碼庫,或使用Git克隆它:git clone https://github.com/spring-guides/gs-handling-form-submission.git
- CD光牒進入gs-handling-form-submission/initial
- 跳轉到建立 Web 控制器。
完成後,您可以對照中的代碼檢查結果gs-handling-form-submission/complete。
從 Spring Initializr 開始
您可以使用這個預先初始化的項目并單擊 Generate 下載下傳 ZIP 檔案。此項目配置為适合本教程中的示例。
手動初始化項目:
- 導航到https://start.spring.io。該服務提取應用程式所需的所有依賴項,并為您完成大部分設定。
- 選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。
- 單擊Dependencies并選擇Spring Web和Thymeleaf。
- 單擊生成。
- 下載下傳生成的 ZIP 檔案,該檔案是根據您的選擇配置的 Web 應用程式的存檔。
如果您的 IDE 具有 Spring Initializr 內建,您可以從您的 IDE 完成此過程。
你也可以從 Github 上 fork 項目并在你的 IDE 或其他編輯器中打開它。
建立 Web 控制器
在 Spring 建構網站的方法中,HTTP 請求由控制器處理。這些元件很容易通過@Controller注釋識别。以下GreetingController清單中的 (from )通過傳回 a 的名稱(在本例中src/main/java/com/example/handlingformsubmission/GreetingController.java為 )來處理 GET 請求。以下負責呈現 HTML 内容:/greetingViewgreetingView
package com.example.handlingformsubmission;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greetingForm(Model model) {
model.addAttribute("greeting", new Greeting());
return "greeting";
}
@PostMapping("/greeting")
public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {
model.addAttribute("greeting", greeting);
return "result";
}
}複制
這個控制器簡潔明了,但有很多事情要做。本節的其餘部分将逐漸對其進行分析。
映射注釋允許您将 HTTP 請求映射到特定的控制器方法。此控制器中的兩個方法都映射到/greeting. 您可以使用@RequestMapping(預設情況下,它映射所有 HTTP 操作,例如GET、POST等)。但是,在這種情況下,該greetingForm()方法具體映射到GETusing @GetMapping,而greetingSubmit()映射到POSTwith @PostMapping。此映射使控制器能夠區分對/greeting端點的請求。
該greetingForm()方法使用一個對象向視圖模闆Model公開一個新對象。以下代碼中的對象 (from Greeting)包含與視圖中的表單字段相對應的字段,例如和,用于從表單中捕獲資訊:Greetingsrc/main/java/com/example/handlingformsubmission/Greeting.javaidcontentgreeting
package com.example.handlingformsubmission;
public class Greeting {
private long id;
private String content;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}複制
greeting方法體的實作依賴于視圖技術,通過将視圖名稱(在這種情況下,我們使用Thymeleaf解析greeting.html模闆并評估各種模闆表達式以呈現表單。以下清單(來自src/main/resources/templates/greeting.html)顯示了greeting模闆:
<!DOCTYPE HTML>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<title>Getting Started: Handling Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Form</h1>
<form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
<p>Id: <input type="text" th:field="*{id}" /></p>
<p>Message: <input type="text" th:field="*{content}" /></p>
<p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>複制
表達式将th:action="@{/greeting}"表單定向到 POST 到/greeting端點,而th:object="${greeting}"表達式聲明模型對象用于收集表單資料。用和表示的兩個表單字段對應于對象中的字段。th:field="{id}"th:field="{content}"Greeting
這涵蓋了用于呈現表單的控制器、模型和視圖。現在我們可以檢視送出表單的過程。如前所述,表單/greeting通過POST調用送出到端點。該greetingSubmit()方法接收Greeting由表單填充的對象。Greeting是 a ,是以@ModelAttribute它綁定到傳入的表單内容。result另外,送出的資料可以通過名稱引用(預設為方法參數的名稱,greeting在本例中為)來呈現在視圖中。在表達式id中呈現。<p th:text="'id: ' + ${greeting.id}" />同樣,在表達式content中呈現。<p th:text="'content: ' + ${greeting.content}" />以下清單(來自src/main/resources/templates/result.html)顯示了結果模闆:
<!DOCTYPE HTML>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<title>Getting Started: Handling Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Result</h1>
<p th:text="'id: ' + ${greeting.id}" />
<p th:text="'content: ' + ${greeting.content}" />
<a href="/greeting">Submit another message</a>
</body>
</html>複制
為清楚起見,此示例使用兩個單獨的視圖模闆來呈現表單并顯示送出的資料。但是,您可以将單個視圖用于這兩個目的。
使應用程式可執行
盡管您可以将此服務打包為傳統的 WAR 檔案以部署到外部應用程式伺服器,但更簡單的方法是建立一個獨立的應用程式。您将所有内容打包在一個可執行的 JAR 檔案中,由一個很好的舊 Javamain()方法驅動。在此過程中,您使用 Spring 對嵌入 Tomcat servlet 容器作為 HTTP 運作時的支援,而不是部署到外部執行個體。以下清單(來自src/main/java/com/example/handlingformsubmission/HandlingFormSubmissionApplication.java)顯示了應用程式類:
package com.example.handlingformsubmission;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HandlingFormSubmissionApplication {
public static void main(String[] args) {
SpringApplication.run(HandlingFormSubmissionApplication.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. 或者,您可以使用建構 JAR 檔案./gradlew build,然後運作 JAR 檔案,如下所示:
java -jar build/libs/gs-handling-form-submission-0.1.0.jar
如果您使用 Maven,則可以使用./mvnw spring-boot:run. 或者,您可以使用建構 JAR 檔案,./mvnw clean package然後運作該 JAR 檔案,如下所示:
java -jar 目标/gs-handling-form-submission-0.1.0.jar
此處描述的步驟建立了一個可運作的 JAR。您還可以建構經典的 WAR 檔案。
顯示記錄輸出。該服務應在幾秒鐘内啟動并運作。
測試服務
現在網站正在運作,通路
http://localhost:8080/greeting,您會看到以下表單: