数据验证及文件操作

一、数据验证

  在开发中,凡是有表单提交的地方,就必须做数据的验证,数据验证必须在两个地方都要做,一个是前端验证,一个服务端再次验证。

前端的验证都是用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

 

 

  1. 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"/>

 

  1. 在要封装的实体对象的属性前或属性的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;

 

  1. 在服务端检测框架有没有错误,如果有,则进行处理。

验证框架中如果有错误信息,则错误信息封装在一个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) 验证属性值必须在合适的范围内。

 

作业,完善学生的查询及添加功能。

二、文件上传下载