编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Springboot官方例子--配置Web应用程序表单验证

wxchong 2024-07-22 22:42:37 开源技术 11 ℃ 0 评论

本指南将引导您完成配置Web应用程序表单以支持验证的过程。

您将构建一个简单的SpringMVC应用程序,该应用程序接受用户输入并使用标准验证注释检查输入。您还将看到如何在屏幕上显示错误消息,以便用户重新输入有效的输入。

我利用业余时间,翻译了Spring官网的例子,方便中文不好的同学,将陆续发到头条上,欢迎大家关注,也可以上我个人BLOG:itmanclub.com,上面有已经翻译过的。

程序结构

└── 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将会你做如下的事:

  • 将 classpath 里面所有用到的jar包构建成一个可执行的 JAR 文件,方便执行你的程序
  • 搜索public static void main()方法并且将它当作可执行类
  • 根据springboot版本,去查找相应的依赖类版本,当然你可以定义其它版本。

创建一个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类有两个属性:名称和年龄。它用几个标准验证注释进行标记:

  • @Size(min=2, max=30) 只允许名字长度为2到30字符
  • @NotNull 不允许为空
  • @Min(18) 年龄最小为18岁

除此之外,您还可以看到名称和年龄的getter/setter,以及一个方便的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方法返回表单模板。它在方法参数中包含一个PersonForm,这样模板就可以将表单属性与PersonForm关联起来。

checkPersonInfo方法接受两个参数:

  • 带有@Valid标记的PersonForm对象,用于收集在表单中填写的属性。
  • *一个BindingResult对象,用于测试和检索验证错误。

您可以从绑定到PersonForm对象的表单中检查所有属性。如果有错误,如果有,则将用户发送回原始表单模板。在这种情况下,将显示所有错误属性。

如果人员的所有属性都有效,那么它会将浏览器重定向到最终结果模板。

创建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>

该页包含一个简单的表单,提交post指向/。它被标记为Web控制器的GET方法中PersonForm对象。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>

创建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);
 }
}

要激活SpringMVC,通常需要将@EnableWebMvc添加到应用程序类中。当在类路径上检测到spring-webmvc时,SpringBoot的@SpringBootApplication已经添加了这个注释。这个注释允许它查找带注释的@Controller类及其方法。

Thymeleaf配置也由@SpringBootApplication负责:默认情况下,模板位于templates/ 下的类路径中,并把文件名中去掉“.html”后缀来作为视图。根据您需要实现的目标,可以通过多种方式更改和覆盖thymeleaf设置,但详细信息与本指南无关。

运行你的程序(STS下,IDEA可参考前面文章)

如果你访问 http://localhost:8080/, 会看到界面如下:

如果输入A作为姓名,输入15作为年龄,然后单击“提交”,会发生什么情况?

在这里您可以看到,因为它违反了PersonForm类中的约束,所以您将返回到“main”。如果您单击提交而条目框中没有任何内容,则会得到一个不同的错误。

如果输入了有效的名称和年龄,则会出现在正确结果页上!

总结

祝贺你!您已经编写了一个简单的Web应用程序,并将验证内置到域对象中。这样,您就可以确保数据符合某些条件,并且用户正确地输入数据。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表