SpringMVC数据格式化

接上一篇:类型转换器(1条消息) SpringMVC视图解析器常见功能、处理静态资源、类型转换器_素心如月娅的博客-CSDN博客https://blog.csdn.net/m0_47010003/article/details/127638393

类型转换器使用

ConversionServiceFactoryBean

 格式化数据 注解 依赖的bean为:

FormattingConversionServiceFactoryBean

 如上图所示,可以看到两者只相差了Formatting,进入源码

 

 发现这两个类中都包含converters属性,所以,当前数据格式化的注解所依赖的bean可以把原类型转换器依赖的bean给替换掉

 

删除以后发现mvc注解驱动报错:

如下图 

根据提示看到FormattingConversionServiceFactoryBean的id值与Spring core

重复了,改为conversionService2

格式化数据注解 @DateTimeFormat

在对象属性上面添加注解,并设置pattern值 

 日期格式通常为“yyyy-MM-dd”:年月日

 这个固定前端传过来的日期格式必须是:2022-11-09 这种格式,其他写法如:2022/11/09都不可以

public class Account {
    private int cardNo;
    private String name;
    private String password;
    private Double balance;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;


//get set方法
//构造方法
//toString()
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/test/testFormat" method="post">

    卡号:<input type="text" name="cardNo"><br/>
    账户:<input type="text" name="name"><br/>
    密码:<input type="text" name="password"><br/>
    余额:<input type="text" name="balance"><br/>
    生日:<input type="text" name="birthday"><br/>

    <input type="submit" value="点击提交数据">
</form>
</body>
</html>

Contrller

直接打印form表单提交过来的数据

@RequestMapping("/testFormat")
public String testFormat(Account account){
    System.out.println(account);
    return "success";
}

tomcat运行

 input中用户提交的是String类型的数据“1997-04-20”,经过@DateTimeFormat注解转换为java.util.Date格式

用户输入错误的格式

 BindingResult获取错误信息

通过BindingResult收集验证错误信息

    @RequestMapping("/testFormat")
    public String testFormat(Account account, BindingResult bindingResult){//报错信息会保存在bindingResult对象中
        System.out.println(account);
        //打印报错信息
        if(bindingResult.getErrorCount()>0){
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                System.out.println(fieldError.getDefaultMessage());
            }
        }

        return "success";
    }

Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthday'; 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 '1997/04/20'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [1997/04/20]

发现格式错误也运行成功,因为对BindingResult的处理相当于trycatch,处理异常,所以不会报错

也可以把报错信息在success.jsp页面打印出来,放到request作用域中

    @RequestMapping("/testFormat")           //报错信息会保存在bindingResult对象中
    public String testFormat(Account account,
                             BindingResult bindingResult,
                             Map<String,Object> map)
    {
        System.out.println(account);
        //打印报错信息
        if(bindingResult.getErrorCount()>0){
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                System.out.println(fieldError.getDefaultMessage());
            }
            map.put("errors",fieldErrors);
        }
        return "success";
    }

 

前端取值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="lyx" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
报错如下:
<div>
    <lyx:forEach items="${requestScope.errors}" var="error">
        ${error.getDefaultMessage()}
    </lyx:forEach>
</div>
</body>
</html>

tomcat运行,控制台和前端报错信息一致

注意:

报错信息

BindingResult  bindingResult
必须是方法第二个形参

因为它保存的是前一个形参的错误信息,

总结:

public String testFormat(Account account, BindingResult bindingResult, Map<String, Object> map) {
//打印错误信息
//把错误信息放到request作用域中
}

需要验证的数据是Account中的birthday,springMVC要求,如果校验失败,则将错误信息自动放入改对象之后,下一个BindingResult中,中间不能插入其他参数,即Account account,BindingResult result 之间不能由其他参数。

如果要将控制台的错误信息,传值给.jsp页面,可以通过Map放到request作用域中

@NumberFormat

对象属性添加@NumberFormat

 @NumberFormat(pattern = "###,###")
    private int cardNo;

 input用户输入100,553,@NumberFormat注解可以转换为int类型数据100553,输出结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring MVC 数据绑定是指将客户端提交的数据绑定到 Controller 中的方法参数或类属性上,从而方便地获取表单数据并进行处理。 Spring MVC 数据绑定主要分为两种类型: 1. 基本类型数据绑定:将客户端提交的基本类型数据(如字符串、整数、布尔型等)绑定到 Controller 中的方法参数上。 例如: ```java @RequestMapping("/login") public String login(String username, String password) { // do something } ``` 2. 对象类型数据绑定:将客户端提交的表单数据绑定到 Controller 中的 POJO(Plain Old Java Object,普通 Java 对象)上。 例如: ```java @RequestMapping("/register") public String register(User user) { // do something } ``` 在对象类型数据绑定中,Spring MVC 默认使用 JavaBean 规范的 setter 方法进行属性赋值,例如: ```java public class User { private String username; private String password; // 省略 getter 和 setter 方法 } ``` 当客户端提交的表单数据中包含 username 和 password 参数时,Spring MVC 将自动调用 User 类中对应的 setter 方法将数据绑定到 User 对象中。 除了默认的 setter 方法,Spring MVC 支持使用自定义的属性编辑器(PropertyEditor)来实现数据类型转换和数据格式化等功能。例如,可以通过自定义属性编辑器将字符串类型的日期转换为 Date 类型。 要使用自定义的属性编辑器,需要在 Controller 类中注册 PropertyEditor 实例: ```java @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); } ``` 上面代码中,我们注册了一个 SimpleDateFormat 类型的属性编辑器,并将其注册到 WebDataBinder 中。然后,我们在 Controller 中的方法参数上使用 Date 类型来接收客户端提交的日期数据,Spring MVC 将自动根据我们注册的属性编辑器将字符串类型的日期转换为 Date 类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素心如月桠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值