• 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都不可以

    1. public class Account {
    2. private int cardNo;
    3. private String name;
    4. private String password;
    5. private Double balance;
    6. @DateTimeFormat(pattern = "yyyy-MM-dd")
    7. private Date birthday;
    8. //get set方法
    9. //构造方法
    10. //toString()
    11. }

    index.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <form action="${pageContext.request.contextPath}/test/testFormat" method="post">
    8. 卡号:<input type="text" name="cardNo"><br/>
    9. 账户:<input type="text" name="name"><br/>
    10. 密码:<input type="text" name="password"><br/>
    11. 余额:<input type="text" name="balance"><br/>
    12. 生日:<input type="text" name="birthday"><br/>
    13. <input type="submit" value="点击提交数据">
    14. form>
    15. body>
    16. html>

    Contrller

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

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

    tomcat运行

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

    用户输入错误的格式

     BindingResult获取错误信息

    通过BindingResult收集验证错误信息

    1. @RequestMapping("/testFormat")
    2. public String testFormat(Account account, BindingResult bindingResult){//报错信息会保存在bindingResult对象中
    3. System.out.println(account);
    4. //打印报错信息
    5. if(bindingResult.getErrorCount()>0){
    6. List fieldErrors = bindingResult.getFieldErrors();
    7. for (FieldError fieldError : fieldErrors) {
    8. System.out.println(fieldError.getDefaultMessage());
    9. }
    10. }
    11. return "success";
    12. }

    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作用域中

    1. @RequestMapping("/testFormat") //报错信息会保存在bindingResult对象中
    2. public String testFormat(Account account,
    3. BindingResult bindingResult,
    4. Map map)
    5. {
    6. System.out.println(account);
    7. //打印报错信息
    8. if(bindingResult.getErrorCount()>0){
    9. List fieldErrors = bindingResult.getFieldErrors();
    10. for (FieldError fieldError : fieldErrors) {
    11. System.out.println(fieldError.getDefaultMessage());
    12. }
    13. map.put("errors",fieldErrors);
    14. }
    15. return "success";
    16. }

     

    前端取值

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@taglib prefix="lyx" uri="http://java.sun.com/jsp/jstl/core" %>
    3. <html>
    4. <head>
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. 报错如下:
    9. <div>
    10. <lyx:forEach items="${requestScope.errors}" var="error">
    11. ${error.getDefaultMessage()}
    12. lyx:forEach>
    13. div>
    14. body>
    15. html>

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

    注意:

    报错信息

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

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

    总结:

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

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

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

    @NumberFormat

    对象属性添加@NumberFormat

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

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

  • 相关阅读:
    Composition API (setup)&& Options API
    Spark 3.0 - 7.LR 多分类实现影评预测电影评分与指标评测
    LeetCode231(Python)—— 2 的幂(简单)
    第四十六篇,C++中的文件IO函数,类型转换与智能指针
    AV1 视频编码标准资源
    JDBC MySQL任意文件读取分析
    基因数据平台
    20、学习MySQL 复制表
    领域驱动模型DDD(三)——使用Saga管理事务
    C++ day2
  • 原文地址:https://blog.csdn.net/m0_47010003/article/details/127649804