您好,登錄后才能下訂單哦!
這個例子用于演示在Spring Boot應用中如何驗證Web 應用的輸入,我們將會建立一個簡單的Spring MVC應用,來讀取用戶輸入并使用validation注解來檢查,并且當用戶輸入錯誤時,應用需要再屏幕上顯示錯誤信息提示用戶重新輸入。
首先構建Maven項目,該項目的pom文件內容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>validating-form-input</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <dependencies> <!-- thymeleaf模板,用于前段渲染 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- 用于輸入驗證 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <!-- 用于支持嵌入式tomcat --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </dependency> <!-- 用于spring boot應用的測試 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
Spring Boot Maven插件提供了很多方便的特性:
Form對象
創建一個Form對象,用于對應HTML頁面中輸入的對象——PersonForm,
package hello; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2017/2/28 * Time: 21:53 */ public class PersonForm { @NotNull @Size(min = 2, max = 30) private String name; @NotNull @Min(18) private Integer age; public String getName() { return name; } public Integer getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public String toString() { return "Person(Name: " + this.name + ", Age: " + this.age + ")"; } }
在這里,@NotNull注解表示該屬性不能為空、@Size(min=2, max=30)表示name屬性的長度在[2,30]之間,@Min(18)表示age屬性最小值為18。
web控制器
編寫一個web控制器,引用為:src/main/java/hello/WebController.java,代碼如下:
package hello; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.validation.Valid; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2017/3/2 * Time: 14:07 */ @Controller public class WebController extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/results").setViewName("results"); } @GetMapping("/") public String showForm(PersonForm personForm) { return "form"; } @PostMapping("/") public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "form"; } return "redirect:/results"; } }
在這個控制器中,GET方法和POST方法都映射到“/”url下,showForm方法會返回“form”字符串,表示模板的名稱,視圖控制器根據這個字符串查找模板文件form.html,在showForm的方法簽名中定義了PersonForm參數,以便模板將屬性綁定到PersonForm對象的屬性中,checkPersonFormInfo方法定義了兩個入參:(1)person對象,在這個參數前用@Valid修飾,用于檢查從form頁面提交過來的屬性值;(2)bindingResult對象,用于存放@Valid注解檢查的結果。
可以從PersonForm表格中提取屬性值,并存入PersonForm對象。@Valid注解會檢查這些屬性的有效性,如果有錯也會把錯誤信息渲染到模板中并顯示到頁面上。
如果所有的屬性都通過校驗,該方法會將瀏覽器重定向到results頁面。
構建thymeleaf頁面
spring boot默認從src/main/resources/templates目錄下查找html頁面,form.html和results.html都放在這里。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Boot Thymeleaf Hello World Example</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form action="#" th:action="@{/}" th:object="${personForm}" method="post"> <table> <tr> <td>Name:</td> <td><input type="text" th:field="*{name}" /></td> <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td> </tr> <tr> <td>Age:</td> <td><input type="text" th:field="*{age}" /></td> <td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td> </tr> <tr> <td><button type="submit">Submit</button></td> </tr> </table> </form> </body> </html>
form.html頁面包含一個簡單的form表格,這個表格和post方法綁定。th:object表示該表格和后端的person對象綁定,這就是bean-backed form,在PersonForm對象中,可以看到th:field="*{name}"和th:field=*{age}。在form表格中,緊挨著name和age標簽,有兩個用于顯示錯誤信息的標簽。頁面的最后有個Submit按鈕,如果用戶輸入的name和age不合法,頁面會顯示錯誤提示信息,如果用戶輸入的name和age不合法,頁面會被路由到下一個頁面。
results.html內容如下:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <title>Title</title> </head> <body> Congratulations! You are old enough to sign up for this site. </body> </html>
創建程序啟動類
創建一個Application類,用于啟動Spring Boot應用,
package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2017/3/2 * Time: 15:50 */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
@SpringBootApplication注解也為Thymeleaf提供了默認配置:默認情況下會從resources/templates目錄下查找模板文件,并將*.html文件中的后綴忽略掉后剩下的文件名稱解析為視圖。可以通過在application.properties里設置相關屬性來修改Thymeleaf的配置,這里我們不再細說。
演示的代碼:https://github.com/duqicauc/validatingforminput
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。