springmvc中做数据验证需要的包
hibernate-validator-6.0.13.Final.jar
validation-api-2.0.1.Final.jar
jboss-logging-3.3.2.Final.jar
1、在需要验证的pojo中加注解
@Size(max= 最大长度,min=最小长度,message="{错误属性文件中的键}")
@Pattern(regexp="\\d{18}",message="{register.usercardno.format.error}") //18位数字的正则表达式:\d{18}(在java中“\”要转义) 或 [0-9]{18};
需要验证的pojo
package com.web.auction.pojo;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class Auctionuser {
private Integer userid;
//用户名长度必须在3到18之间
@Size(min=3,max=18,message="{register.username.length.error}")
private String username;
//密码的长度必须大于等于6
@Size(min=6,message= "{register.password.length.error}")
private String userpassword;
//省份证号必须为18位数字
@Pattern(regexp="\\d{18}",message="{register.usercardno.format.error}") //18位数字的正则表达式:\d{18}(在java中“\”要转义) 或 [0-9]{18}
private String usercardno;
//电话必须为11位数字
@Pattern(regexp="[0-9]{11}",message="{register.telephone.format.error}")
private String usertel;
/**** 省略setters和getters ******/
}
2、设置错误属性文件,不同字段验证失败的错误信息
ValidationMessages.properties属性文件,他们的值是中文对应的编码,具体意思是其后面的中文注释
register.username.length.error=\u7528\u6237\u540D\u5FC5\u987B\u4E3A3\u523018\u4F4D //用户名必须为3道18位
register.password.length.error=\u5BC6\u7801\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E6\u4F4D //密码必须大于等于6位
register.usercardno.format.error=\u8EAB\u4EFD\u8BC1\u53F7\u7801\u5FC5\u987B\u4E3A18\u4F4D\u6570\u5B57— //身份证号必须为18位
register.telephone.format.error=\u7535\u8BDD\u5FC5\u987B\u4E3A11\u4F4D\u6570\u5B57 //电话必须为11位
3、在需要验证的controller方法中该POJO对象的参数添加@Validated注解,并在POJO参数之后紧跟bindingResult对象(该对象保存验证错误的信息)
这里对注册需要保存的用户信息进行数字校验
//BindingResult bindingResult是存储错误信息的容器,必须紧跟在要验证的pojo之后
@RequestMapping("/register")
public String register(Model model,@ModelAttribute("registerUser") @Validated Auctionuser auctionUser,BindingResult bindingResult) {
//如果数字校验出错,即不满足注册时不满足第一步中对应属性的要求,则会产生第二步中对应的错误,bindingResult用于存放这些错误信息
if(bindingResult.hasErrors()) {
//获取错误信息列表
List<FieldError> list = bindingResult.getFieldErrors();
for (FieldError fieldError : list) {
//getField()方法获得了input标签的name属性值
//如: 用户名:<input type="text" name="username">
//如果用户名校验出错,则getField()获得的值为name属性值“username”
String key = fieldError.getField();
//获得对应的报错信息,即第二步中属性文件中对应错误信息的值
String value = fieldError.getDefaultMessage();
System.out.println(key+"=="+value);
//保存到model中,返回界面
model.addAttribute(key, value);
}
//处理完错误,跳回注册页面
return "register";
}
//如果没有错误,才能进行注册
//2、完成注册,把用户信息存入数据库
this.userService.addUser(auctionUser);
return "login";
}
处理错误:
使用bindingResult对象hasErrors()判断是否有错误,
有错误,使用getFieldError()获取错误列表;
把错误存入作用域中,
每个filedError有个获取对应标签name属性的方法getField(),这是错误信息的键
fieldError.getDefaultMessage()这是错误信息的值
4、把错误回显到页面
这里使用的是thymeleaf静态模版
<div class="wrap">
<!-- main begin-->
<form action="/register">
<div class="zclf login logns">
<h1 class="blue">用户注册</h1>
<dl>
<dd>
<label> <small>*</small>用户名</label>
<input type="text" class="inputh lf" name="username" th:value="${registerUser.username}" />
<!-- 这里的${username} 即取第三步中存入的key-value对,
key为getField()方法获得的username,
value为getDefaultMessage()方法获得的错误信息:“用户名必须为3到18位” -->
<span class="red laba" th:text="${username}"></span>
</dd>
<dd>
<label> <small>*</small>密码</label>
<input type="text" class="inputh lf" name="userpassword" th:value="${registerUser.userpassword}" />
<span class="red laba" th:text="${userpassword}"></span>
</dd>
<dd>
<label> <small>*</small>身份证号</label>
<input type="text" class="inputh lf" name="usercardno" th:value="${registerUser.usercardno}" />
<span class="red laba" th:text="${usercardno}"></span>
</dd>
<dd>
<label> <small>*</small>电话</label>
<input type="text" class="inputh lf" name="usertel" th:value="${registerUser.usertel}" />
<span class="red laba" th:text="${usertel}"></span>
</dd>
</dl>
</div>
<!-- main end-->
</form>
<!-- footer begin-->
</div>
<!--footer end-->
运行结果如图
当输入对应的属性不符合要求并点击注册时,回到页面,给出提示信息
5、本文中使用到的注解
数据校验注解,是jaax包中的注解
@Size(max= 最大长度,min=最小长度,message="出现错误的提示信息")
@Pattern(regexp="正则表达式",message="出现错误的提示信息")
@Validated:制定该参数传入controller方法时要进行校验
@ModelAttribute(name="存入model中的名字"): 定义其后的参数进行数据回显,就是把其后的参数添加到model中
相当于model.addAttribute("xxx",xxx);