Spring Boot MVC表单验证示例

时间:2020-01-09 10:44:31  来源:igfitidea点击:

在本Spring Boot MVC教程中,我们将介绍如何使用标准验证注释来验证表单字段。
表单验证是Web应用程序中很重要的一部分,需要用户输入才能避免用户输入无效的值。我们还将看到如何在字段前面显示具有无效值的错误消息,以便用户可以重新输入以使其有效。

Starter依赖

我们将为此Spring Boot表单验证示例选择的Starter依赖项是

spring-boot-starter-web
spring-boot-starter-thymeleaf
spring-boot-devtools

本示例使用Thymeleaf模板进行查看,因此可查看百里香酸启动子。
每当classpath上的文件发生更改时,使用spring-boot-devtools的应用程序都会自动重启,因此我们不必每次都自行重建和重启服务器。

Maven – pom.xml

具有上述入门依赖项的pom.xml。

<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>
<!-- For hot swapping -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
</dependency>

Bean验证API和Hibernate验证程序

对于表单字段验证,使用了Bean Validation API,该API定义了驻留在javax.validation.constraints包中的一些注释。

注意,Bean Validation API仅提供接口,Hibernate Validator是该API的实现。

仅通过包含spring-boot-starter-web,我们将获得所需的jar。我们需要做的就是在字段中使用注释来指定约束。

Java Bean验证API中定义的一些注释如下:

  • @ NotBlank-带注释的元素不能为null,并且必须至少包含一个非空白字符。
  • @NotEmpty-带注释的元素不能为null或者为空。
  • @NotNull-带注释的元素不能为null。
  • @ Size-带注释的元素大小必须在指定的边界之间。可以使用main和max属性指定边界。
  • @ Digits-带注释的元素必须是可接受范围内的数字。
  • @ Max-带注释的元素必须是一个数字,其值必须小于或者等于指定的最大值。
  • @ Min-带注释的元素必须是一个数字,其值必须大于或者等于指定的最小值。
  • @ Email-字符串必须是格式正确的电子邮件地址。

Spring Boot表单验证示例步骤

我们在这里构建的是Thymeleaf视图,这是用于用户注册的表单。所需的类是

1.一个Model bean类(User.java),其字段带有必需的约束。
2. userform.html Thymeleaf模板,它是用户注册表单UI。
3.在注册表单中单击"提交"按钮时,将进行字段验证,如果再次显示任何错误注册表单并显示错误消息。如果没有错误,则使用user.html Thymeleaf模板显示输入的用户数据。

带有验证错误的表单的屏幕截图

Spring Boot表单验证–模型类

有一个模型类User,其中包含字段和约束。

import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;

public class User {
  @NotEmpty(message = "Field can't be left empty")
  @Size(min=2, max=20, message = "Has to be in 2-20 chars range")
  private String firstName;
  @NotEmpty
  @Size(min=2, max=20)
  private String lastName;
  @NotEmpty
  @Email
  private String email;
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }	
}

如我们所见,字段带有必需的约束。

  • firstName不能为null或者为空,并且必须包含2至20个字符。
  • lastName不能为null或者为空,并且必须包含2至20个字符。
  • 电子邮件不能为空,并且应该是格式正确的电子邮件。

如果未指定任何消息,则显示默认消息,我们可以使用"消息"属性指定自己的消息。

Spring Boot表单验证– Thymeleaf模板

在src / main / resources / templates中创建一个userform.html文件。

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Spring Boot form validation</title>
<link rel="stylesheet" th:href="@{/css/style.css}"/>
</head>
<body>
  <h1>User Registration Form</h1>
  <form action="#" th:action="@{/showUser}" th:object="${user}" method="post">
    <table>
      <tr>
        <td>First Name:</td>
        <td><input type="text" th:field="*{firstName}" placeholder="Enter First Name"/></td>
        <td th:if="${#fields.hasErrors('firstName')}" th:errors="*{firstName}" class="error"></td>
      </tr>
      <tr>
        <td>Last Name:</td>
        <td><input type="text" th:field="*{lastName}" placeholder="Enter Last Name"/></td>
        <td th:if="${#fields.hasErrors('lastName')}" th:errors="*{lastName}" class="error"></td>
      </tr>
      <tr>
        <td>Email:</td>
        <td><input type="text" th:field="*{email}" placeholder="email"/></td>
        <td th:if="${#fields.hasErrors('email')}" th:errors="*{email}" class="error"></td>
      </tr>
      <tr>
        <td><button type="submit">Submit</button></td>
      </tr>
    </table>
  </form>
</body>
</html>

在表单标记中,将动作指定为" / showUser"(th:action =" @ {/ showUser}"),并且方法为post。此表单绑定的对象是用户对象(th:object =" $ {user}")
对于每个字段,都会添加一个新列以呈现验证错误消息。

<td th:if="${#fields.hasErrors('firstName')}" th:errors="*{firstName}" class="error"></td>

另一个用于显示用户数据的模板src / main / resources / templates / user.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
  <h1>User Details</h1>
  <table>
    <tr><td th:text="'First Name: ' + ${user.firstName}"></td> </tr>
    <tr><td th:text="'Last Name: ' + ${user.lastName}"></td> </tr>
    <tr><td th:text="'Email: ' + ${user.email}"></td> </tr>
  </table>
</body>
</html>

还有一个CSS类用于设置错误消息的样式,我们可能已经在src / main / resources / templates / userform.html文件中注意到了它的用法。

<link rel="stylesheet" th:href="@{/css/style.css}"/>

And here

<td th:if="${#fields.hasErrors('email')}" th:errors="*{email}" class="error">

因此,创建一个文件src / main / resources / static / css / style.css

.error {
    color: red;
    font-style: italic;
}

Spring Boot表单验证–控制器类

在UserController.java类中,有映射到URL路径的处理程序方法。

import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import com.theitroad.sb.model.User;

@Controller
public class UserController {
  @GetMapping(value = "/registerUser")
  public String registerUser(Model model) { 
    model.addAttribute("user", new User());
    return "userform";
  }
	
  @PostMapping(value="/showUser")
  public String showUser(@Valid @ModelAttribute("user") User user, BindingResult result, Model model) { 
    if(result.hasErrors()) {
      return "userform";
    }
    model.addAttribute("user", user);
    return "user";
  }
}

在showUser方法中,与User类对象一起使用了@Valid注释。使用@Valid注释可确保对在对象及其属性上定义的约束进行验证。

使用BindingResult实例检查是否存在验证错误。如果存在验证错误,将再次显示带有错误消息的注册表格,否则返回逻辑视图名称" user",该名称将呈现user.html模板。

应用类别

我们可以通过执行具有main方法的应用程序类来运行该应用程序。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootProjectApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringBootProjectApplication.class, args);
  }
}

成功启动应用程序后,我们可以根据控制器映射使用URL访问应用程序。

http:// localhost:8080 / registerUser

http:// localhost:8080 / showUser