本指南将引导您完成配置Web应用程序表单以支持验证的过程。
你会建立什么
您将构建一个简单的Spring MVC应用程序,该应用程序接受用户输入并使用标准验证批注检查输入。您还将看到如何在屏幕上显示错误消息,以便用户可以重新输入有效的输入。
你需要什么
-
约15分钟
-
最喜欢的文本编辑器或IDE
-
JDK 1.8或更高版本
-
您还可以将代码直接导入到IDE中:
如何完成本指南
像大多数Spring 入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都可以使用工作代码。
要从头开始 ,请继续使用Gradle构建 。
要跳过基础知识 ,请执行以下操作:
-
下载并解压缩本指南的源存储库,或使用Git对其进行克隆:
git clone https://github.com/spring-guides/gs-validating-form-input.git
-
光盘进入
gs-validating-form-input/initial
-
继续创建一个PersonForm对象 。
完成后 ,您可以根据中的代码检查结果gs-validating-form-input/complete
。
用Gradle构建
用Gradle构建
首先,您设置一个基本的构建脚本。在使用Spring构建应用程序时,可以使用任何喜欢的构建系统,但是此处包含使用Gradle和Maven所需的代码。如果您都不熟悉,请参阅使用Gradle 构建Java项目或使用Maven构建Java项目 。
创建目录结构
在您选择的项目目录中,创建以下子目录结构;例如, mkdir -p src/main/java/hello
在* nix系统上:
└── src └── main └── java └── hello
创建一个Gradle构建文件
以下是最初的Gradle构建文件 。
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
bootJar {
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.springframework.boot:spring-boot-starter-web")
compile("org.hibernate.validator:hibernate-validator")
compile("org.apache.tomcat.embed:tomcat-embed-el")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
Spring Boot gradle插件提供了许多方便的功能:
-
它收集类路径上的所有jar,并构建一个可运行的单个“über-jar”,这使执行和传输服务更加方便。
-
它搜索
public static void main()
标记为可运行类的方法。 -
它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项 。您可以覆盖所需的任何版本,但是它将默认为Boot选择的一组版本。
用Maven构建
用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 https://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>2.1.6.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.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</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>
</project>
Spring Boot Maven插件提供了许多方便的功能:
-
它收集类路径上的所有jar,并构建一个可运行的单个“über-jar”,这使执行和传输服务更加方便。
-
它搜索
public static void main()
标记为可运行类的方法。 -
它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项 。您可以覆盖所需的任何版本,但是它将默认为Boot选择的一组版本。
使用您的IDE进行构建
使用您的IDE进行构建
-
阅读如何将本指南直接导入Spring Tool Suite中 。
-
在IntelliJ IDEA中阅读如何使用本指南。
创建一个PersonForm对象
该应用程序涉及验证用户的姓名和年龄,因此首先您需要创建一个类来支持表单以创建人。
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
以及方便toString()
方法。
创建一个Web控制器
现在,您已经定义了表单支持对象,是时候创建一个简单的Web控制器了。
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.WebMvcConfigurer;
@Controller
public class WebController implements WebMvcConfigurer {
@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";
}
}
该控制器具有GET和POST方法,两者都映射到/
。
的showForm
方法返回form
模板。它包括一个PersonForm
在其方法签名中,以便模板可以将表单属性与PersonForm
。
的checkPersonFormInfo
方法接受两个参数:
-
一种
personForm
标有的对象@Valid
收集要构建的表单中填写的属性。 -
一种
bindingResult
对象,以便您可以测试并检索验证错误。
您可以从绑定到表单的表单中检索所有属性PersonForm
宾语。在代码中,您测试是否有错误,如果有,则将用户送回原始位置。 form
模板。在这种情况下,将显示所有错误属性。
如果此人的所有属性均有效,则它将浏览器重定向到最终results
模板。
构建一个HTML前端
现在,您构建“主页”页面。
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>
该页面包含一个简单的表单,每个字段位于表的单独插槽中。该表格旨在向/
。它被标记为由personForm
您在网络控制器的GET方法中看到的对象。这称为Bean支持的形式 。有两个字段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);
}
}
要激活Spring MVC,通常需要添加@EnableWebMvc
到Application
类。但是Spring Boot的@SpringBootApplication
当在类路径上检测到spring-webmvc时,已经添加了此注释。相同的注释允许它找到注释的@Controller
类及其方法。
Thymeleaf的配置也由@SpringBootApplication
:默认情况下,模板位于以下路径中的类路径中templates/
并通过去除文件名中的'.html'后缀来解析为视图。Thymeleaf设置可以根据需要实现的方式以多种方式更改和覆盖,但是详细信息与本指南无关。
构建可执行的JAR
您可以使用Gradle或Maven从命令行运行该应用程序。您还可以构建一个包含所有必需的依赖项,类和资源的可执行JAR文件,然后运行该文件。构建可执行的jar使得在整个开发生命周期中,跨不同环境等等的情况下,可以轻松地将服务作为应用程序进行发布,版本化和部署。
如果您使用Gradle,则可以使用./gradlew bootRun
。或者,您可以通过使用以下命令构建JAR文件: ./gradlew build
然后运行JAR文件,如下所示:
如果使用Maven,则可以通过使用以下命令运行应用程序./mvnw spring-boot:run
。或者,您可以使用以下命令构建JAR文件: ./mvnw clean package
然后运行JAR文件,如下所示:
此处描述的步骤将创建可运行的JAR。您还可以构建经典的WAR文件 。 |
该应用程序应在几秒钟内启动并运行。
如果您访问http:// localhost:8080 / ,则应该看到类似以下内容:

如果输入名称A和年龄15 ,然后单击Submit,会发生什么情况?


在这里您可以看到,因为它违反了PersonForm
上课,您会跳回“主页”页面。如果在输入框中单击“什么都没有提交”,则会出现其他错误。

如果输入有效的姓名和年龄,您最终会进入results
页!

摘要
恭喜你!您已经编写了一个简单的Web应用程序,并在域对象中内置了验证功能。这样,您可以确保数据符合特定条件,并且用户可以正确输入数据。
也可以看看
以下指南也可能会有所帮助:
是否要编写新指南或为现有指南做出贡献?查看我们的贡献准则 。
所有指南均以代码的ASLv2许可证和写作的Attribution,NoDerivatives创作共用许可证发布 。 |