详解SpringBoot构建的Web项目如何在服务端校验表单输入

作者:阿杜 时间:2021-08-22 23:51:59 

这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC应用,来读取用户输入并使用validation注解来检查,并且当用户输入错误时,应用需要再屏幕上显示错误信息提示用户重新输入。

首先构建Maven项目,该项目的pom文件内容如下:


<?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.example</groupId>
 <artifactId>validating-form-input</artifactId>
 <version>1.0-SNAPSHOT</version>

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>1.5.1.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>
   <!-- thymeleaf模板,用于前段渲染 -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
   </dependency>

<!-- 用于输入验证 -->
   <dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-validator</artifactId>
   </dependency>

<!-- 用于支持嵌入式tomcat -->
   <dependency>
     <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-el</artifactId>
   </dependency>

<!-- 用于spring boot应用的测试 -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
   </dependency>
 </dependencies>

</project>

Spring Boot Maven插件提供了很多方便的特性:

  • 它将该项目中需要的各个Jar包收集起来,并打包成可直接运行的Jar包,以更方便得部署和传输;

  • 它会搜索包含“public static void main()”方法的类,该类就是可运行Jar包的启动类;

  • 它提供了内在的支持,去匹配Spring Boot的版本号。

Form对象

创建一个Form对象,用于对应HTML页面中输入的对象——PersonForm,


package hello;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
* Created by IntelliJ IDEA.
* User: duqi
* Date: 2017/2/28
* Time: 21:53
*/
public class PersonForm {

@NotNull
 @Size(min = 2, max = 30)
 private String name;

@NotNull
 @Min(18)
 private Integer age;

public String getName() {
   return name;
 }

public Integer getAge() {
   return age;
 }

public void setName(String name) {
   this.name = name;
 }

public void setAge(Integer age) {
   this.age = age;
 }

public String toString() {
   return "Person(Name: " + this.name + ", Age: " + this.age + ")";
 }
}

在这里,@NotNull注解表示该属性不能为空、@Size(min=2, max=30)表示name属性的长度在[2,30]之间,@Min(18)表示age属性最小值为18。

web控制器

编写一个web控制器,引用为:src/main/java/hello/WebController.java,代码如下:


package hello;

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;

import javax.validation.Valid;

/**
* Created by IntelliJ IDEA.
* User: duqi
* Date: 2017/3/2
* Time: 14:07
*/
@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";
 }
}

在这个控制器中,GET方法和POST方法都映射到“/”url下,showForm方法会返回“form”字符串,表示模板的名称,视图控制器根据这个字符串查找模板文件form.html,在showForm的方法签名中定义了PersonForm参数,以便模板将属性绑定到PersonForm对象的属性中,checkPersonFormInfo方法定义了两个入参:(1)person对象,在这个参数前用@Valid修饰,用于检查从form页面提交过来的属性值;(2)bindingResult对象,用于存放@Valid注解检查的结果。

可以从PersonForm表格中提取属性值,并存入PersonForm对象。@Valid注解会检查这些属性的有效性,如果有错也会把错误信息渲染到模板中并显示到页面上。

如果所有的属性都通过校验,该方法会将浏览器重定向到results页面。

构建thymeleaf页面

spring boot默认从src/main/resources/templates目录下查找html页面,form.html和results.html都放在这里。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
 <title>Spring Boot Thymeleaf Hello World Example</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<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>

form.html页面包含一个简单的form表格,这个表格和post方法绑定。th:object表示该表格和后端的person对象绑定,这就是bean-backed form,在PersonForm对象中,可以看到th:field="*{name}"和th:field=*{age}。在form表格中,紧挨着name和age标签,有两个用于显示错误信息的标签。页面的最后有个Submit按钮,如果用户输入的name和age不合法,页面会显示错误提示信息,如果用户输入的name和age不合法,页面会被路由到下一个页面。

results.html内容如下:


<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8" />
 <title>Title</title>
</head>
<body>
 Congratulations! You are old enough to sign up for this site.
</body>
</html>

创建程序启动类

创建一个Application类,用于启动Spring Boot应用,


package hello;

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

/**
* Created by IntelliJ IDEA.
* User: duqi
* Date: 2017/3/2
* Time: 15:50
*/
@SpringBootApplication
public class Application {

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

@SpringBootApplication注解也为Thymeleaf提供了默认配置:默认情况下会从resources/templates目录下查找模板文件,并将*.html文件中的后缀忽略掉后剩下的文件名称解析为视图。可以通过在application.properties里设置相关属性来修改Thymeleaf的配置,这里我们不再细说。

演示的代码:https://github.com/duqicauc/validatingforminput

来源:https://segmentfault.com/a/1190000020841272

标签:Spring,Boot,校验,表单输入
0
投稿

猜你喜欢

  • SpringMVC实现数据绑定及表单标签

    2022-03-24 18:06:47
  • MyBatis分页插件PageHelper的使用与原理

    2021-06-15 09:24:35
  • Android View类与SurfaceView类详解

    2022-07-17 14:49:24
  • spring boot整合log4j2及MQ消费处理系统日志示例

    2023-06-17 17:47:54
  • SpringCloud全面解析@FeignClient标识接口的过程

    2023-08-05 12:34:44
  • Android ProgressDialog进度条使用详解

    2022-09-24 17:06:03
  • Apache和Tomcat有什么区别_动力节点Java学院整理

    2023-08-15 08:49:44
  • c# 制作gif的四种方法

    2023-03-17 20:01:08
  • CentOS 7系统下配置自定义JDK的教程

    2022-02-27 13:46:26
  • C#如何自定义multipart/form-data的解析器

    2023-12-04 18:59:03
  • C#中string.Empty和null的区别详解

    2023-05-19 16:01:45
  • 详解JAVA Spring 中的事件机制

    2022-01-13 05:26:33
  • 详解Java中如何正确书写单例模式

    2022-06-20 01:35:00
  • java递归算法的实例详解

    2021-06-07 12:15:17
  • 基于C#的UDP协议的同步通信实现代码

    2023-11-14 09:13:58
  • Android客户端post请求服务器端实例

    2022-10-10 23:49:43
  • Java Socket使用加密协议进行传输对象的方法

    2023-11-28 12:47:44
  • c# 快速排序算法

    2021-10-18 07:33:20
  • C#泛型和反射实例解析

    2023-10-04 03:49:02
  • Maven pom.xml与settings.xml详解

    2022-10-12 19:48:41
  • asp之家 软件编程 m.aspxhome.com