服务器表单校验
原创
©著作权归作者所有:来自51CTO博客作者一个爱听音乐的程序员的原创作品,请联系作者获取转载授权,否则将追究法律责任
为什么后端要做表单的校验呢,如果只使用前端来校验的话,如果浏览器把 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
添加如下内容
在模型当中添加对应的校验规则,模型也就是 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
注解即可
/**
* @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 中, 修改控制器代码
/**
* @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"%>
服务器表单校验
启动工程填写表单信息,效果如下图所示,当然没有填写错误的情况下是没有任何事情的,介绍完毕
result.jsp 的内容如下所示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
result