详细解读_SpringMvc类型转换&数据格式化&数据验证

发布于:2022-12-10 ⋅ 阅读:(567) ⋅ 点赞:(0)

1.类型转换器

Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型。 开发者在实际应用中使用框架内置的类型转换器基本上就够。
在日常的企业开发需求中,我们输入文本框的内容全部都是字符串类型,但是在后端处理的时候我们可以用其他基本类型来接受数据,也可以使用实体类来接受参数,这个是怎么完成的呢?就是通过SpringMVC提供的类型转换器,SpringMVC内部提供了非常丰富的类型转换器的支持.

对于自己构造类型转换器,需要做以下 5 件事:
1.创建实体类。
2.创建控制器类。
3.创建自定义类型转换器类。
4.注册类型转换器。
5.创建相关视图

这里不再展示,感兴趣的可以自己去了解一下

2.数据格式化

Spring 提供了两个可以用于格式化数字,日期和时间的注解@NumberFormat和 @DateTimeFormat,这两个标签可以用于javabean的属性或方法参数上。

@NumberFormat可以用来格式化任何的数字的基本类型(如int,long)或 java.lang.Number的实例(如 BigDecimal, Integer)。

@DateTimeFormat可以用来格式 化java.util.Date、java.util.Calendar和
java.util.Long类型.

要指定数字或日期/时间类型的属性,只需要在其上添加 @NumberFormat或 @DateTimeFormat注解可以了。

DateTimeFormat,互斥属性: iso。类型为DateTimeFormat.ISO
DateTimeFormat.ISO.DATE: 格式yyyy-MM-dd。
DateTimeFormat.ISO.DATE_TIME:格式yyyy-MM- dd HH:mm:ss .SSSZ。
DateTimeFormat.ISO.NONE: 表示不使用ISO格 式的时间。

NumberFormat pattern。
类型为String,使用自定义的数字格式化字符串,“##,###.##”,style。
类型为NumberFormat.Style,常用值:
1.Style.NUMBER正常数字类型
2.Style.PERCENT百分数类型
3.Style.CURRENCY 货币类型

需要将实现类改为:FormattingConversionServiceFactoryBean 才可以同时支持自定义类型转换器和格式化

<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService">
    </bean>

例子:
实体类对变量实现:

    private Integer id;
    private String username;
    @DateTimeFormat(pattern ="yyyy-MM-dd")
    private Date birthday;
    @NumberFormat(style = NumberFormat.Style.CURRENCY)
    private Double balance;
    private String[] hobbies;
    @NumberFormat(pattern = "#,###.##")
    private Double salary;
    @NumberFormat(style = NumberFormat.Style.PERCENT)
    private Double taskCount;

在这里插入图片描述

3.数据校验

一般情况下我们会在前端页面实现数据的校验,但是大家需要注意的 是前端校验会存在数据的不安全问题,因此一般情况下我们都会使用前端校验 +后端校验的方式,这样的话既能够满足用户的体验度,同时也能保证数据的安 全,下面来说一下在springmvc中如何进行后端数据校验。
JSR303是 Java 为 Bean 数据合法性校验提供的标准,通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规 则,并通 j过标准的验证接口对 Bean 进行验证。 Hibernate Validator 实现了JSR349验证注解规范的技术 JSR303:

spring中拥有自己的数据校验框架,同时支持JSR303标准的校验框 架,可以在通过添加注解的方式进行数据校验。在spring中本身没有提供 JSR303的实现,需要导入依赖的包。

在maven仓库中导入相关依赖
在这里插入图片描述
示例:

    @NotNull(message = "id不能为空")
    @Min(value=1,message = "id必须大于0")
    private Integer id;
    @NotEmpty(message = "用户名不能为空")
    @Length(min = 4,max = 8,message = "用户名的长度必须在{min}和{max}位之间")
    @Pattern(regexp="^[0-9a-zA-Z]+$",message = "用户名只能输入0-9或者a-z")
    private String username;
    @Past(message = "您难道穿越了吗?")
    @DateTimeFormat(pattern="yyyy/MM/dd")
    private Date birthday;
    @NumberFormat(style = NumberFormat.Style.CURRENCY )   //货币
    private Double balance;   //余额  ¥5000
    private String[] hobbies;
    @NumberFormat(pattern = "#,###.##")
    @Range(min = 2000,max = 1000000,message = "工资必须在{min}和{max}之间")    //Size的范围是int 不能用于验证Double
    private Double salary; //工资  10,000.00
    @Range(min=0,max=100,message = "任务完成度必须在{min}和{max}之间")        //Range的范围是Long所以,Range可以控制的范围更大
    @NumberFormat(style = NumberFormat.Style.PERCENT)  /*不加%会 *100来显示   加上会按你提交精度来显示*/
    private Double taskCount;// 任务完成百分比 90%

在这里插入图片描述

4.Springmvc form标签

自动绑定,自动回显数据, 如果是新增的情况下也需要保证有该标签所需的对象 Form标签

  1. 支持全部http请求方法 比如method=”put” put\delete 提交方式
  2. 数据自动回显:需要使用modelAttribute指定数据的对象
  3. 使用path来双向绑定属性
  4. 动态数据绑定:Select 、 checkboxes、 radiobottons、都可以使用Items 制 定数据源 可以是list (当List的泛型是javaBean的时候需要制定itemValue和 itemLabel)、map(不需要制定itemValue和itemLabel)

add.jsp

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form action="${pageContext.request.contextPath}/form/user" method="post" modelAttribute="user">
    <p>
        id:<form:input path="id"></form:input><form:errors path="id"></form:errors>
    </p>
    <p>
        username:<form:input path="username"></form:input><form:errors path="username"></form:errors>
    </p>
    <p>
        birthday:<form:input path="birthday"></form:input><form:errors path="birthday"></form:errors>
    </p>
    <p>
        balance:<form:input path="balance"></form:input><form:errors path="balance"></form:errors>
    <p>
        salary:<form:input path="salary"></form:input><form:errors path="salary"></form:errors>
    </p>
    <p>
        taskCount:<input type="text" name="taskCount" value="${user.taskCount}">
    </p>
    <p>
        hobbies:
        <form:checkbox path="hobbies" value="唱歌"></form:checkbox>
        <form:label path="hobbies">唱歌</form:label>
        <form:checkbox path="hobbies" value="跳舞"></form:checkbox>
        <form:label path="hobbies">跳舞</form:label>
    </p>
    <p>
        <form:button>提交</form:button>
    </p>
</form:form>

UserControl 控制器类

 @PostMapping("/form/user")
    public String springformAdd(@Valid User user, BindingResult result, Model model) {

        // 判断当前是否出现了错误
        if(result.hasErrors()) {
            return "user/add";
        }
        System.out.println(user);
        return "show";
    }![请添加图片描述](https://img-blog.csdnimg.cn/ea66e7374f9146c0a5d0a8352f8897f6.gif)

    @GetMapping("/user/add")
    public String addview(User user){
        return "user/add";
    }
}

请添加图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到