数据验证及文件操作
一、数据验证
在开发中,凡是有表单提交的地方,就必须做数据的验证,数据验证必须在两个地方都要做,一个是前端验证,一个服务端再次验证。
前端的验证都是用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"); } |
验证框架的使用步骤:
- 导入验证框架的jar包
- 在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"/> |
- 在要封装的实体对象的属性前或属性的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; |
- 在服务端检测框架有没有错误,如果有,则进行处理。
验证框架中如果有错误信息,则错误信息封装在一个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) 验证属性值必须在合适的范围内。 |