一、数据验证
在开发中,凡是有表单提交的地方,就必须做数据的验证,数据验证必须在两个地方都要做,一个是前端验证,一个服务端再次验证。
前端的验证都是用JS脚本来实现,因为js是运行在客户端,执行速度快,不需要服务器参与,减少服务端压力,用户体验好。但是,浏览器是可以禁用js脚本运行,所以就可以绕过客户端验证,直接把错误数据提交到服务端,所以必须在服务端再次验证。
后端验证的方式是写Java代码来实现验证, 如下:
// 增,
@RequestMapping(value = "save")
public ModelAndView save(Student student) {
if(student.getName().length()== 0) {
}else if (student.getPhone().length()!=11) {
}
return new ModelAndView("studentList");
}
验证框架的使用步骤:
1.导入验证框架的jar包
2.在springMVC的配置文件配置验证框架,在提交时,SpringMVC在封装数据时,启动验证框架对数据进行验证。
<!-- 校验器 -->
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="validationMessageSource"/>
</bean>
<!-- 验证消息器 -->
<bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"/>
3.在要封装的实体对象的属性前或属性的set方法前添加相应的验证规则(注解),注意,验证框架只是验证有没有错误,它不会对错误进行片。
@Length(min=6,max=10,message=“姓名的长度是6-10个字符!”)
@NotBlank(message=“姓名不能为空!”)
private String name;
private String sex;
@Range(min=18,max=40,message=“年龄在18-40岁之间!”)
private int age;
@NotBlank(message=“电话不能为空!”)
@Pattern(regexp="^1[3|4|5|7|8][0-9]{9}$",message=“手机号码不正确!”)
private String phone;
@NotBlank(message=“地址不能为空!”)
private String address;
@Email(message=“邮箱格式不正确!”)
private String email;
4.在服务端检测框架有没有错误,如果有,则进行处理。
验证框架中如果有错误信息,则错误信息封装在一个FieldError对象中,采用键值对的形式存储,键就是属性名: email–>邮箱格式不正确! 封装成: FieldError 。
控制器处理:
//@Validated表示此对象要通过验证框架,BindingResult对象封装了验证框架的验证信息
@RequestMapping(value = "save")
public ModelAndView save(@Validated Student student,BindingResult result,Model model) {
//针对提交的封装好的实体对象来判断是否通过了验证,如果通过则把对象向底层传。否则返回添加页面,并提示错误信息
if(result.hasErrors()) {
Map<String, String> errors = new HashMap<String, String>();
//循环取存储在 BindingResult对象中封装的验证信息
for (FieldError f : result.getFieldErrors()) {
System.out.println(f.getField()+"--"+f.getDefaultMessage());
errors.put(f.getField(), f.getDefaultMessage());
}
//年级信息
List<Grade> grades = new GradeServiceImpl().getGrades();
model.addAttribute("student",student);
model.addAttribute("errors",errors);
model.addAttribute("grades",grades);
return new ModelAndView("studentAdd");
}else {
//把数据传向底层,保存到数据库中。
return new ModelAndView("redirect:list");
}
}
jsp页面处理:
<form action="/springMVCDemo/student/save" method="post">
<fieldset>
<legend>学生基本信息</legend>
<p>姓名:<input type="text" name="name" value="${student.name }"> <span class="s">${errors.name }</span></p>
<p>性别:<input type="radio" name="sex" value="男" checked="checked"> 男
<input type="radio" name="sex" value="女"> 女
</p>
<p>年龄:<input type="text" name="age" value="${student.age }"> <span class="s">${errors.age }</span></p>
<p>电话:<input type="text" name="phone" value="${student.phone }"> <span class="s">${errors.phone }</span></p>
<p>地址:<input type="text" name="address" value="${student.address }"> <span class="s">${errors.address }</span></p>
<p>邮箱:<input type="text" name="email" value="${student.email }"> <span class="s">${errors.email }</span></p>
<p>生日:<input type="text" name="birthday" value="${student.birthday }"></p>
<p>年级:
<select name="grade.gradeId">
<c:forEach items="${grades }" var="g">
<c:choose>
<c:when test="${g.gradeId==student.grade.gradeId }">
<option value="${g.gradeId }" selected="selected">${g.gradeName }</option>
</c:when>
<c:otherwise>
<option value="${g.gradeId }">${g.gradeName }</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
</p>
<p> <input type="submit" value="保 存"></p>
</fieldset>
</form>
验证的注解:
@Null 验证对象是否为 null。
@NotNull 验证对象是否不为 null。
@AssertTrue 验证 Boolean 对象是否为 true。
@AssertTrue 验证 Boolean 对象是否为 false。
@Max(value) 验证 Number 和 String 对象是否小于等于指定值。
@Min(value) 验证 Number 和 String 对象是否大于等于指定值。
@DecimalMax(value) 验证注解的元素值小于等于 @DecimalMax 指定的 value 值。
@DecimalMin(value) 验证注解的元素值大于等于 @DecimalMin 指定的 value 值。
@Digits(integer,fraction) 验证字符串是否符合指定格式的数字,nteger 指定整数精度,fraction 指定小数精度。
@Size(min,max) 验证对象长度是否在给定的范围内。
@Past 验证 Date 和 Calendar 对象是否在当前时间之前。
@Future 验证 Date 和 Calendar 对象是否在当前时间之后。
@Pattern 验证 String 对象是否符合正则表达式的规则。
@NotBlank 检查字符串是不是 Null,被 Trim 的长度是否大于0,
只对字符串,且会去掉前后空格。
@URL 验证是否是合法的 url。
@Email 验证是否是合法的邮箱。
@CreditCardNumber 验证是否是合法的信用卡号。
@Length(min,max) 验证字符串的长度必须在指定范围内。
@NotEmpty 检查元素是否为 Null 或 Empty。
@Range(min,max,message) 验证属性值必须在合适的范围内。