springMVC数据校验
1. spring的validation校验
Spring校验框架在org.springframework.validation
包中。
LocalValidatorFactoryBean
即实现了Spring的validator
接口,也实现了JSr 303
的validator
接口。只需要在Spring容器中定义一个LocalValidatorFactoryBean
,即可将其注入到需要数据校验的Bean中:
会默认装配好一个LocalValidatorFactoryBean
,不需手动配置。
1.1 实现Spring的Validator接口
//实现Spring的Validator接口
@Repository("userValidator")
public class UserValidator implements Validator {
// 该校验器能够对clazz类型的对象进行校验。
@Override
public boolean supports(Class> clazz) {
// User指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口
return User.class.isAssignableFrom(clazz);
}
// 对目标类target进行校验,并将校验错误记录在errors当中
@Override
public void validate(Object target, Errors errors) {
/**
使用ValidationUtils中的一个静态方法rejectIfEmpty()来对loginname属性进行校验,
假若'loginname'属性是 null 或者空字符串的话,就拒绝验证通过 。
*/
ValidationUtils.rejectIfEmpty(errors, "loginName", null, "登录名不能为空");
ValidationUtils.rejectIfEmpty(errors, "password", null, "密码不能为空");
User user = (User)target;
if(user.getLoginName().length() > 10){
// 使用Errors的rejectValue方法验证
errors.rejectValue("loginName", null, "用户名不能超过10个字符");
}
if(user.getPassword() != null
&& !user.getPassword().equals("")
&& user.getPassword().length() < 6){
errors.rejectValue("password", null, "密码不能小于6位");
}
}
}
1.2 Controller层
@Controller(value="validatorUserController")
@RequestMapping(value="/validatorTest")
public class UserController {
private static final Log logger = LogFactory.getLog(UserController.class);
// 注入UserValidator对象
@Autowired
@Qualifier("userValidator")
private UserValidator userValidator;
@RequestMapping(value="/{formName}")
public String loginForm(
@PathVariable String formName,
Model model){
User user = new User();
model.addAttribute("user",user);
// 动态跳转页面
return "validatorTest/"+formName;
}
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(
@ModelAttribute User user,
Model model,
Errors errors) {
logger.info(user);
model.addAttribute("user", user);
// 调用userValidator的验证方法
userValidator.validate(user, errors);
// 如果验证不通过跳转到loginForm视图
if(errors.hasErrors()){
return "validatorTest/"+"loginForm";
}
return "validatorTest/"+"success";
}
}
1.3 springmvc配置
1.4 jsp
1.4.1 loginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix= "form" uri= "http://www.springframework.org/tags/form" %>
测试Validator接口验证
登录页面
1.4.2 success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
测试ConversionService
登录名:${requestScope.user.loginName }
登录名:${requestScope.user.password }
2. Hibernate Validator校验(JSR 303校验)
注解 |
功能 |
@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
附加的 constraint
注解 |
功能 |
@NotBlank(message =) |
验证字符串非null,且被trim的长度必须大于0,对字符串会去掉前后空格 |
@Email |
被注释的元素必须是电子邮箱地址 |
@Length(min=,max=) |
被注释的字符串的大小必须在指定的范围内 |
@NotEmpty |
被注释的字符串的必须非空(NUL、EMPTY)。用于Array、Collection、Map、String |
@Range(min=,max=,message=) |
被注释的元素必须在合适的范围内 |
@URL |
验证是否是合法的url |
@CreditCardNumber |
验证是否是合法的信用卡号码 |
2.1 引入jar包
org.hibernate
hibernate-validator
5.3.5.Final
2.2 注解实体类
2.2.1 User.java
(含错误信息)
public class User implements Serializable {
@NotBlank(message="登录名不能为空")
private String loginname;
@NotBlank(message="密码不能为空")
@Length(min=6,max=8,message="密码长度必须在6位到8位之间")
private String password;
@NotBlank(message="用户名不能为空")
private String username;
@Range(min=15, max=60,message="年龄必须在15到60岁之间")
private int age;
@Email(message="必须是合法的邮箱地址")
private String email;
@DateTimeFormat(pattern="yyyy-MM-dd")
@Past(message="生日必须是一个过去的日期")
private Date birthday;
@Pattern(regexp="^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$",message="无效的电话号码")
private String phone;
//省略get/set方法
}
2.2.2User.java
(错误信息存文件,国际化)
public class User implements Serializable {
@NotBlank
private String loginname;
@NotBlank
@Length(min=6,max=8)
private String password;
@NotBlank
private String username;
@Range(min=15, max=60)
private int age;
@Email
private String email;
@DateTimeFormat(pattern="yyyy-MM-dd")
@Past
private Date birthday;
@Pattern(regexp="[1][3,8][3,6,9][0-9]{8}")
private String phone;
//省略get/set方法
}
2.3 Controller控制层
@Controller
@RequestMapping(value="/jsrValidatorTest")
public class HibernateValidatorController {
private static final Log logger = LogFactory.getLog(UserController.class);
@RequestMapping(value="/{formName}")
public String loginForm(
@PathVariable String formName,
Model model){
User user = new User();
model.addAttribute("user",user);
// 动态跳转页面
return "jsrValidatorTest/"+formName;
}
// 数据校验使用@Valid,后面跟着Errors对象保存校验信息
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(
@Valid @ModelAttribute User user,
Errors errors,
Model model) {
logger.info(user);
if(errors.hasErrors()){
return "jsrValidatorTest/"+"registerForm";
}
model.addAttribute("user", user);
return "jsrValidatorTest/"+"success";
}
}
2.4 springmvc配置
2.5 jsp
2.5.1 registerForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix= "form" uri= "http://www.springframework.org/tags/form" %>
测试JSR 303
注册页面
2.5.2 success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
测试JSR 303
测试JSR 303
登录名:${requestScope.user.loginname }
密码:${requestScope.user.password }
用户名:${requestScope.user.username }
年龄:${requestScope.user.age }
邮箱:${requestScope.user.email }
生日:
电话:${requestScope.user.phone }