Thymeleaf格式化LocalDateTime类型
参考文章及说明
参考了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>
效果展示: