這個教程告訴你如何經過配置使一個web應用支持表單驗證.javascript
你將構建一個用標準驗證註解接受用戶輸入和檢查輸入的Spring MVC應用.css
大約15分鐘html
你最喜歡的文本編輯器或者IDE前端
JDK 1.8 或者更新java
Gradle 2.3+ 或者 Maven 3.0+git
你也能夠直接把你的代碼導入IDE:github
IntelliJ IDEAspring
像大多數Spring開始教程同樣,你能夠從頭開始而後一步步完成它,或者你能夠跳過你熟悉的部分,無論如何你最後都能得到工做代碼,apache
第一步 Build with Gradle.
你能夠跳過這些基礎:
下載 而後解壓這個教程的原代碼, 或者使用 Git克隆:git clone https://github.com/spring-guides/gs-validating-form-input.git
cd into gs-validating-form-input/initial
跳轉去 Create a PersonForm object.
當你完成,你能夠再次檢查你的結果,和gs-validating-form-input/complete.
比較.
首先設置一個基本的構建腳本.你可使用任何你喜歡的方式去構建Spring應用,可是你的代碼必須可以經過Gradle和Maven工做.若是你還不熟悉,能夠參考 Building Java Projects with Gradle 或者 Building Java Projects with Maven.
在你新建的項目目錄下,建立以下的子目錄結構;例如,用mkdir -p src/main/java/hello
在*nix系統上建立.
└── src └── main └── java └── hello
就是下面這樣的初始化文件.
build.gradle
buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'org.springframework.boot' jar { baseName = 'gs-validating-form-input' version = '0.1.0' } repositories { mavenCentral() } sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { compile("org.springframework.boot:spring-boot-starter-thymeleaf") compile("org.hibernate:hibernate-validator") compile("org.apache.tomcat.embed:tomcat-embed-el") testCompile("org.springframework.boot:spring-boot-starter-test") }
這個 Spring Boot gradle plugin提供了不少便捷的特性:
public static void main()
方法標記爲可執行類首先設置一個基本的構建腳本.你可使用任何你喜歡的方式去構建Spring應用,可是你的代碼必須可以經過Maven工做.若是你還不熟悉,能夠參考 Building Java Projects with Maven.
在你新建的項目目錄下,建立以下的子目錄結構;例如,用mkdir -p src/main/java/hello
在*nix系統上建立.
└── src └── main └── java └── hello
pom.xml
<?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.springframework</groupId> <artifactId>gs-validating-form-input</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <repositories> <repository> <id>spring-releases</id> <name>Spring Releases</name> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <name>Spring Releases</name> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project>
這個Spring Boot Maven plugin提供了不少便捷的特性:
public static void main()
方法標記爲可執行類這個應用將會驗證用戶的名字和年齡,因此你須要爲建立一個用戶來新建一個類.
src/main/java/hello/PersonForm.java
package hello; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; public class PersonForm { @NotNull @Size(min=2, max=30) private String name; @NotNull @Min(18) private Integer age; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String toString() { return "Person(Name: " + this.name + ", Age: " + this.age + ")"; } }
這個PersonForm
類有兩個屬性:name
和age
.它們被幾個典型的驗證註解標記:
@Size(min=2, max=30)
將只容許名字2至30個字符的長度@NotNull
不容許空值,若是這個屬性是空的Spring MVC 將什麼也不生成@Min(18)
小於18的年齡將不被容許除此以外,你也能夠看到name
和 age
的 getters/setters 方法和toString()
方法同樣便捷.
如今你已經定義了一個表單對象,接着建立一個簡單的web controller.
src/main/java/hello/WebController.java
package hello; import javax.validation.Valid; 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; @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"; } }
這個controller有GET和POST方法,請求路徑都是/
.
showForm
方法返回 form
模板.這個模板和PersonForm
裏的屬性創建關聯.
checkPersonFormInfo
方法接收兩個參數:
@Valid
註解的person
對象,用來綁定你填寫表單的用戶屬性bindingResult
對象,你能夠獲取驗證的結果你也能夠在PersonForm
裏獲取表單裏的全部屬性.若是驗證沒有經過,你能夠把錯誤信息都返回到form
模板中並顯示出來.
若是一個person的全部屬性都驗證經過,就跳轉到results
模板.
如今建立"main"頁面.
src/main/resources/templates/form.html
<html> <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>
這個頁面包含一個簡單的表單,每一個字段放在分開的表格裏.表單以post的方式提交至/
.提交成功後你就能夠在web controller的GET方法中看見它了.這就是所謂的bean-backed form. 你能夠看到在PersonForm
bean裏有兩個被標記的字段,th:field="{name}"
和th:field="{age}"
.緊挨着這兩個字段下有第二個表格,用來顯示驗證的錯誤信息.
最後點擊按鈕去提交.通常來講,若是用戶輸入的姓名或者年齡違反 @Valid
的約束規則,它就會跳轉回這個頁面而且顯示錯誤信息.若是用戶名和年齡驗證經過則跳轉至下一頁.
src/main/resources/templates/results.html
<html> <body> Congratulations! You are old enough to sign up for this site. </body> </html>
在這個簡單的例子中,這些頁面沒有任何複雜的css和javascript.可是在實際的生產環境中,你要學會如何裝飾你的網站頁面.
在這個應用中咱們用的模板語言是 Thymeleaf.比HTML標籤多一些。
src/main/java/hello/Application.java
package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
你能夠給Application
類添加@EnableWebMvc
註解去激活Spring MVC . 可是,當它發現spring-webmvc 在你的類路徑下,Spring Boot's的@SpringBootApplication
註解就會自動添加這個註解。這個註解會去查找@Controller
註解的類和類下的方法。
Thymeleaf 的配置也是由@SpringBootApplication
管理的:模板的默認路徑是在classpath 下的templates/
而且以'.html'結尾來解析成視圖的。Thymeleaf 的設置是能夠改變和重寫成你想要的樣子,可是本教程不詳細介紹。
你能夠在命令行經過Gradle或者Maven直接運行應用.或者你也能夠編譯成一個包含全部必須依賴,類,源文件的JAR文件來運行。編譯成JAR包使得應用更容易部署,也能夠在不一樣的環境中運行。
若是你使用的是Gradle,你能夠經過./gradlew bootRun
命令使它運行.或者你也能夠
用./gradlew build
把它編譯成JAR文件.而後你就能夠運行這個JAR文件:
java -jar build/libs/gs-validating-form-input-0.1.0.jar
若是你使用的是Maven,你能夠經過./mvnw spring-boot:run
命令使它運行.或者你也能夠用./mvnw clean package
把它編譯成JAR文件.而後你就能夠運行這個JAR文件:
java -jar target/gs-validating-form-input-0.1.0.jar
以上的過程會建立一個可執行的JAR文件。你也能夠編譯成典型的WAR 文件來代替
這個應用在幾秒內就能夠被運行
若是你訪問 http://localhost:8080/,你將看到像這樣的內容:
你輸入一我的A的名字和15歲點擊submit會發生什麼?
在這裏你能夠看到,當你的輸入不符合PersonForm
的約束,就會跳轉回這個頁面,而且展現錯誤信息,若是你什麼都不填寫,將會獲得一個不同的錯誤信息.
若是你輸入一個有效的姓名和年齡,你就會跳轉至results
頁面!
恭喜你,你已經編寫了一個驗證對象屬性的web應用。這種方法能夠保證數據是否是空的,而且按照你的要求是正確的。
原文來源於https://spring.io/guides/gs/validating-form-input/#initial