springmvc学习笔记(25)——数据格式化与数据校验

来源:互联网 发布:网络新词汇2017 编辑:程序博客网 时间:2024/05/23 16:55

遇到的问题

我们先来看个例子

写一个Data类做测试,有两个属性,Date和float类型

package com.zj.model;import java.util.Date;public class Data {    private Date date;    private float salary;    public Date getDate() {        return date;    }    public void setDate(Date date) {        this.date = date;    }    public float getSalary() {        return salary;    }    public void setSalary(float salary) {        this.salary = salary;    }    @Override    public String toString() {        return "Data [date=" + date + ", salary=" + salary + "]";    }}

写一个目标方法

    @RequestMapping("/testDataFormat")    public void testDataFormat(Data data){        System.out.println(data);    }

界面

<form action="testDataFormat" method="post">    <input type="text" name="date" />    <input type="text" name="salary" />    <input type="submit" value="submit" /></form>

这里写图片描述

点击提交,你会得到下面这个结果
这里写图片描述

这就是数据的格式转换的问题。

如何解决

springmvc配置文件要有mvc:annotation-driven

 <mvc:annotation-driven />

给属性加上注解

package com.zj.model;import java.util.Date;import org.springframework.format.annotation.DateTimeFormat;import org.springframework.format.annotation.NumberFormat;public class Data {    @DateTimeFormat(pattern="yyyy-MM-dd")    private Date date;    //#号代表一个数字  1,123,345.9    @NumberFormat(pattern="#,###,###.#")    private float salary;    public Date getDate() {        return date;    }    public void setDate(Date date) {        this.date = date;    }    public float getSalary() {        return salary;    }    public void setSalary(float salary) {        this.salary = salary;    }    @Override    public String toString() {        return "Data [date=" + date + ", salary=" + salary + "]";    }}

加上格式化的注解之后,就可以正常的解析前端传来的数据了

提交数据
这里写图片描述

控制台打印结果
这里写图片描述

类型转换失败怎么办

有时候,从前端传来的数据不是我们想要的格式,转换失败怎么办

我可以在目标方法中传入一个参数BindingResult

    @RequestMapping("/testDataFormat")    public void testDataFormat(Data data,BindingResult result){        //发生错误        if(result.getErrorCount() > 0){            System.out.println("出错了,请注意!");            //循环打印所有的错误信息            for(FieldError error:result.getFieldErrors()){                //打印错误                System.out.println(error.getField()+":"+error.getDefaultMessage());            }        }        System.out.println(data);    }

如果你了解数据绑定的流程,那么就应该知道BindingResult。当数据绑定失败的时候,错误结果就会被放入BindingResult中。

模拟错误场景

输入错误信息
这里写图片描述

点击提交,控制台打印出错误信息

出错了,请注意!date:Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.format.annotation.DateTimeFormat java.util.Date for value 'we'; nested exception is java.lang.IllegalArgumentException: Unable to parse 'we'salary:Failed to convert property value of type 'java.lang.String' to required type 'float' for property 'salary'; nested exception is java.lang.NumberFormatException: For input string: "fdf"Data [date=null, salary=0.0]

数据校验

  • 对于表单提交过来的页面,我们通常都要进行校验。
    比如email格式是否符合要求,id是否为空,生日是否是今天之前等

  • 在我所看的教学视频中,使用了JSR303进行验证,它需要一些jar包,个人感觉去找这些jar包是比较麻烦的,而且有一个jar还需要替换掉tomcat服务器里面的jar包。所以我个人不太想用的JSR303进行验证。

  • 有兴趣的朋友可以去看 尚硅谷的springmvc教学视频

0 0