为什么后端要做表单的校验呢,如果只使用前端来校验的话,如果浏览器把 JS 给禁用掉, 就完犊子啦

JSR


  • JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE6.0 中
  • JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解
  • 指定校验规则,并通过标准的验证接口对 Bean 进行验证


Hibernate Validator


  • Hibernate Validator 是 JSR 303 的一个参考实现
  • 除了支持所有标准的校验注解外,它还支持以下的扩展注解


常用的校验规则

Bean Validation 中内置的约束

注解名称

作用

@Null

被注释的元素必须为 null

@NotNull

被注释的元素必须不为 null

@AssertTrue

被注释的元素必须为 true

@AssertFalse

被注释的元素必须为 false

@Min(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max=, min=)

被注释的元素的大小必须在指定的范围内

@Digits (integer, fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past

被注释的元素必须是一个过去的日期

@Future

被注释的元素必须是一个将来的日期

@Pattern(regex=, flag=)

被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的约束

注解名称

作用

@NotBlank(message = )

验证字符串非null,且长度必须大于0

@Email

被注释的元素必须是电子邮箱地址

@Length(min=, max = )

被注释的字符串的大小必须在指定的范围内

@NotEmpty

被注释的字符串的值必须非空

@Range(min =, max =,message = )

被注释的元素必须在合适的范围内

使用 Hibernate Validator

导入相关 jar 包,或者引入相关依赖

服务器表单校验_错误信息

修改配置文件 ​​springmvc.xml​​ 添加如下内容

<mvc:annotation-driven/>

在模型当中添加对应的校验规则,模型也就是 JavaBean 对象新建 User.java 类文件

/**
* @author BNTang
*/
@Data
public class User {

@NotNull
private String username;

@Max(value = 200, message = "请输入合法的年龄")
private Integer age;

@Email(message = "请输入正确的邮箱")
private String email;

@Pattern(regexp = "^1([34578])\\d{9}$", message = "请输入正确的手机号")
private String phone;
}

在处理器的方法的入参标记 ​​@valid​​ 注解即可

服务器表单校验_html_02

/**
* @author: BNTang
*/
@Controller
public class MyFirstController {

@RequestMapping("/form")
public String form(@Valid User user, BindingResult bindingResult) {
int errorCount = bindingResult.getErrorCount();

if (errorCount != 0) {
// 获取校验错误字段及错误信息
List<FieldError> fieldErrors = bindingResult.getFieldErrors();

fieldErrors.forEach(i -> System.out.println(i.getField() + " : " + i.getDefaultMessage()));
}

return "result.jsp";
}
}

错误信息在页面中回显

使用原始表单显示错误信息,把错误信息写到 Model 中, 修改控制器代码

服务器表单校验_java_03

/**
* @author: BNTang
*/
@Controller
public class MyFirstController {

@RequestMapping("/form")
public String form(@Valid User user, BindingResult bindingResult, Model model) {
int errorCount = bindingResult.getErrorCount();

if (errorCount != 0) {
// 获取校验错误字段及错误信息
List<FieldError> fieldErrors = bindingResult.getFieldErrors();

fieldErrors.forEach(i -> model.addAttribute(i.getField(), i.getDefaultMessage()));
return "index.jsp";
}

return "result.jsp";
}
}

发送请求的表单内容如下, 如下的是 index.jsp 的内容

<%@ page contentType="text/html;charset=UTF-8" language="java"%>


服务器表单校验



姓名:${username}


年龄:${age}


邮箱:${email}


手机号:${phone}





启动工程填写表单信息,效果如下图所示,当然没有填写错误的情况下是没有任何事情的,介绍完毕

服务器表单校验_html_04

result.jsp 的内容如下所示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


result