这个教程告诉你如何经过配置使一个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