Spring Boot 之表单验证
博客专区 > swide 的博客 > 博客详情
Spring Boot 之表单验证
swide 发表于6个月前
Spring Boot 之表单验证
  • 发表于 6个月前
  • 阅读 79
  • 收藏 2
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

这个教程告诉你如何通过配置使一个web应用支持表单验证.

你将构建什么样的应用

你将构建一个用标准验证注解接受用户输入和检查输入的Spring MVC应用.

你将需要准备什么

如何去完成这个教程

像大多数Spring开始教程一样,你可以从头开始然后一步步完成它,或者你可以跳过你熟悉的部分,不管如何你最后都能获得工作代码,

第一步 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

共有 人打赏支持
粉丝 0
博文 20
码字总数 11722
×
swide
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: