这个教程告诉你如何通过配置使一个web应用支持表单验证.
你将构建什么样的应用
你将构建一个用标准验证注解接受用户输入和检查输入的Spring MVC应用.
你将需要准备什么
-
大约15分钟
-
你最喜欢的文本编辑器或者IDE
-
JDK 1.8 或者更新
-
你也可以直接把你的代码导入IDE:
如何去完成这个教程
像大多数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
类有两个属性:name
和age
.它们被几个典型的验证注解标记:
@Size(min=2, max=30)
将只允许名字2至30个字符的长度@NotNull
不允许空值,如果这个属性是空的Spring MVC 将什么也不生成@Min(18)
小于18的年龄将不被允许
除此之外,你也可以看到name
和 age
的 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/,你将看到像这样的内容:
你输入一个人A的名字和15岁点击submit会发生什么?
在这里你可以看到,当你的输入不符合PersonForm
的约束,就会跳转回这个页面,并且展示错误信息,如果你什么都不填写,将会得到一个不一样的错误信息.
如果你输入一个有效的姓名和年龄,你就会跳转至results
页面!
总结
恭喜你,你已经编写了一个验证对象属性的web应用。这种方法可以保证数据是不是空的,并且按照你的要求是正确的。
原文来源于https://spring.io/guides/gs/validating-form-input/#initial