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

相关文章
相关标签/搜索