尚硅谷书城项目订单日期LocalDateTime类型使用Thymeleaf格式化

参考文章及说明

参考了hunterzhang86文章,原文有更加详细的Thymeleaf 使用日期的方法。

本文的配套项目尚硅谷丨2022版JavaWeb教程(全新技术栈,全程实战),这里记录下书城项目中我的订单页面的日期格式化问题解决过程。
日期未格式化前:
未格式化前

数据库配套环境
MySQL版本是8.0+, “mysql-connector-java” 的版本是8.0.12;
JDBC 连接MySql Driver使用的是 “com.mysql.cj.jdbc.Driver”;

在这个版本下,订单日期字段在数据库里是设置datetime类型,但是读取的时候就变成了Timestamp,使用视频中老师讲的#dates.format 的语法进行格式化肯定会报错类型不匹配,因此就要用thymeleaf针对LocalDateTime类型的方法。

添加Maven 依赖项

我们需要向 pom.xml 添加另一个thymeleaf的java8time依赖项,用于支持java8的时间LocalDate和LocalDatetime。

        <!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-java8time -->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
            <version>3.0.4.RELEASE</version>
        </dependency>

如果不用maven,也可以访问上面注释里面的链接在网页里下载jar包导入。
下载

修改BaseDAO中的setValue方法进行日期类型转换

BaseDAO中的setValue方法作用是通过反射技术,将从数据库读取到的数据赋值给JavaBean中的每个属性,但是由于数据库读取到的日期类型是Timestamp,会报参数类型不匹配错误:

 Caused by: java.lang.IllegalArgumentException: Can not set java.time.LocalDateTime field com.atguigu.bookStore.pojo.OrderBean.orderDate to java.sql.Timestamp

解决办法是添加一个对实体类的属性类型----“java.time.LocalDateTime”判断,并对其进行转换,格式类型转换代码添加在原来的setValue()方法isMyType判断代码之前:

            if (isMyType(typeName)) {
                Class typeNameClass = Class.forName(typeName);
                Constructor constructor = typeNameClass.getDeclaredConstructor(Integer.class);
                propertyValue = constructor.newInstance(propertyValue);

            }

并且将 if (isMyType(typeName)) 改为 else if (isMyType(typeName)) :

            //获取当前字段的类型名称
            String typeName = field.getType().getName();
            //解决MySQL8驱动 日期时间类型报错
            if("java.time.LocalDateTime".equals(typeName)){
                Timestamp timestamp = (Timestamp) propertyValue;
                propertyValue = timestamp.toLocalDateTime();
            }
            else if (isMyType(typeName)) {
                Class typeNameClass = Class.forName(typeName);
                Constructor constructor = typeNameClass.getDeclaredConstructor(Integer.class);
                propertyValue = constructor.newInstance(propertyValue);
            }

Thymeleaf模板引擎添加 Java8TimeDialect:

ViewBaseServlet.java配置视图解析器的 init() 方法中添加方言Java8TimeDialect对象,允许从 Thymeleaf 模板格式化和创建 Temporal 对象:

        // 4.创建模板引擎对象
        templateEngine = new TemplateEngine();
        templateEngine.addDialect(new Java8TimeDialect()); //所添加的代码位置

        // 5.给模板引擎对象设置模板解析器
        templateEngine.setTemplateResolver(templateResolver);

使用#temporals格式化日期

前面准备工作完成后,我们就可以在html网页文件中,使用Thymeleaf对LocalDateTime日期类型进行格式了:

<td th:text="${#temporals.format(orderBean.orderDate,'yyyy年MM月dd日 HH:mm:ss')}" >2015.04.23</td>

效果展示:
格式化后的日期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值