springMVC数据校验
1. spring的validation校验
Spring校验框架在
org.springframework.validation
包中。
LocalValidatorFactoryBean
即实现了Spring的validator
接口,也实现了JSr 303
的validator
接口。只需要在Spring容器中定义一个LocalValidatorFactoryBean
,即可将其注入到需要数据校验的Bean中:<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<mvc:annotation-driven>
会默认装配好一个LocalValidatorFactoryBean
,不需手动配置。
1.1 实现Spring的Validator接口
UserValidator.java
//实现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层
UserController.java
@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配置
<!-- 注意扫描范围需要把validator接口实现类扫描进去 -->
<context:component-scan base-package="com.zhougl.web" />
<mvc:annotation-driven />
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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试Validator接口验证</title>
</head>
<body>
<h3>登录页面</h3>
<!-- 绑定user -->
<form:form modelAttribute="user" method="post" action="login" >
<table>
<tr>
<td>登录名:</td>
<td><form:input path="loginName"/></td>
<!-- 显示loginName属性的错误信息 -->
<td><form:errors path="loginName" cssStyle= "color:red"/></td>
</tr>
<tr>
<td>密码:</td>
<td><form:input path="password"/></td>
<!-- 显示password属性的错误信息 -->
<td><form:errors path="password" cssStyle= "color:red"/></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form:form>
</body>
</html>
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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试ConversionService</title>
</head>
<body>
登录名:${requestScope.user.loginName }<br>
登录名:${requestScope.user.password }<br>
</body>
</html>
2. Hibernate Validator校验(JSR 303校验)
- 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包
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.5.Final</version>
</dependency>
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配置
springmvc-config.xml
<context:component-scan base-package="com.zhougl.web" />
<mvc:annotation-driven />
<!-- 国际化 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化资源文件名 -->
<property name="basenames" value="message"/>
</bean>
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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试JSR 303</title>
</head>
<body>
<h3>注册页面</h3>
<form:form modelAttribute="user" method="post" action="login" >
<table>
<tr>
<td>登录名:</td>
<td><form:input path="loginname"/></td>
<td><form:errors path="loginname" cssStyle= "color:red"/></td>
</tr>
<tr>
<td>密码:</td>
<td><form:input path="password"/></td>
<td><form:errors path="password" cssStyle= "color:red"/></td>
</tr>
<tr>
<td>用户名:</td>
<td><form:input path="username"/></td>
<td><form:errors path="username" cssStyle= "color:red"/></td>
</tr>
<tr>
<td>年龄:</td>
<td><form:input path="age"/></td>
<td><form:errors path="age" cssStyle= "color:red"/></td>
</tr>
<tr>
<td>邮箱:</td>
<td><form:input path="email"/></td>
<td><form:errors path="email" cssStyle= "color:red"/></td>
</tr>
<tr>
<td>生日:</td>
<td><form:input path="birthday"/></td>
<td><form:errors path="birthday" cssStyle= "color:red"/></td>
</tr>
<tr>
<td>电话:</td>
<td><form:input path="phone"/></td>
<td><form:errors path="phone" cssStyle= "color:red"/></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form:form>
</body>
</html>
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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试JSR 303</title>
</head>
<body>
<h3>测试JSR 303</h3>
登录名:${requestScope.user.loginname }<br>
密码:${requestScope.user.password }<br>
用户名:${requestScope.user.username }<br>
年龄:${requestScope.user.age }<br>
邮箱:${requestScope.user.email }<br>
生日:<fmt:formatDate value="${requestScope.user.birthday}"
pattern="yyyy年MM月dd日"/><br>
电话:${requestScope.user.phone }<br>
</body>
</html>
网友评论