Spring Boot 之表單驗證

這個教程告訴你如何經過配置使一個web應用支持表單驗證.javascript

你將構建什麼樣的應用

你將構建一個用標準驗證註解接受用戶輸入和檢查輸入的Spring MVC應用.css

你將須要準備什麼

如何去完成這個教程

像大多數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. 比較.

用Gradle構建

首先設置一個基本的構建腳本.你可使用任何你喜歡的方式去構建Spring應用,可是你的代碼必須可以經過Gradle和Maven工做.若是你還不熟悉,能夠參考 Building Java Projects with Gradle 或者 Building Java Projects with Maven.

建立目錄結構

在你新建的項目目錄下,建立以下的子目錄結構;例如,用mkdir -p src/main/java/hello在*nix系統上建立.

└── src
    └── main
        └── java
            └── hello
建立一個Gradle初始化文件

就是下面這樣的初始化文件.

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提供了不少便捷的特性:

  • 它收集全部的classpath中的jar包而後構建成一個可運行的 "über-jar",它可使你執行或者部署服務更便捷.
  • 它會尋找public static void main() 方法標記爲可執行類
  • 它提供了一個匹配 Spring Boot 依賴的依賴解析器.你能夠覆蓋成任何你但願的版本,可是它會選擇版本的默認集合.

用Maven構建

首先設置一個基本的構建腳本.你可使用任何你喜歡的方式去構建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提供了不少便捷的特性:

  • 它收集全部的classpath中的jar包而後構建成一個可運行的 "über-jar",它可使你執行或者部署服務更便捷.
  • 它會尋找public static void main() 方法標記爲可執行類
  • 它提供了一個匹配 Spring Boot 依賴的依賴解析器.你能夠覆蓋成任何你但願的版本,可是它會選擇版本的默認集合.

用你的IDE構建

建立一個用戶表單對象

這個應用將會驗證用戶的名字和年齡,因此你須要爲建立一個用戶來新建一個類.

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類有兩個屬性:nameage.它們被幾個典型的驗證註解標記:

  • @Size(min=2, max=30) 將只容許名字2至30個字符的長度
  • @NotNull 不容許空值,若是這個屬性是空的Spring MVC 將什麼也不生成
  • @Min(18) 小於18的年齡將不被容許

除此以外,你也能夠看到nameage的 getters/setters 方法和toString() 方法同樣便捷.

建立一個web controller

如今你已經定義了一個表單對象,接着建立一個簡單的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 模板.

建立一個HTML前端模板

如今建立"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.可是在實際的生產環境中,你要學會如何裝飾你的網站頁面.

建立一個Application類

在這個應用中咱們用的模板語言是 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 的設置是能夠改變和重寫成你想要的樣子,可是本教程不詳細介紹。

編譯成可執行JAR

你能夠在命令行經過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/,你將看到像這樣的內容:

img

你輸入一我的A的名字和15歲點擊submit會發生什麼?

img

img

在這裏你能夠看到,當你的輸入不符合PersonForm 的約束,就會跳轉回這個頁面,而且展現錯誤信息,若是你什麼都不填寫,將會獲得一個不同的錯誤信息.

img

若是你輸入一個有效的姓名和年齡,你就會跳轉至results頁面!

img

總結

恭喜你,你已經編寫了一個驗證對象屬性的web應用。這種方法能夠保證數據是否是空的,而且按照你的要求是正確的。

原文來源於https://spring.io/guides/gs/validating-form-input/#initial

相關文章
相關標籤/搜索