深色模式
在首页中格式化日期
了解了这些工具对象后,我们可以用它们来修改首页中日期的展示方式。
原本我们在 HomeController 中这样处理日期(提前格式化):
java
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy");
Calendar cal = Calendar.getInstance();
WebContext ctx = new WebContext(webExchange, webExchange.getLocale());
// 控制器中提前格式化日期为字符串
ctx.setVariable("today", dateFormat.format(cal.getTime()));
templateEngine.process("home", ctx, writer);现在可以简化控制器逻辑——只传递原始的 Calendar 对象,把格式化交给视图层处理:
java
WebContext ctx = new WebContext(webExchange, webExchange.getLocale());
// 直接传递 Calendar 对象,不提前格式化
ctx.setVariable("today", Calendar.getInstance());
templateEngine.process("home", ctx, writer);然后在视图(模板)中通过 #calendars 工具对象完成日期格式化:
html
<p>
Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011</span>
</p>核心逻辑解释
- 前后端职责划分:
- 改造前:控制器既要处理业务逻辑,又要负责日期格式化(视图层的展示逻辑),职责混杂;
- 改造后:控制器仅传递原始数据(
Calendar对象),视图层通过 Thymeleaf 工具对象处理格式化,符合“后端管数据,前端管展示”的设计原则。
- #calendars 工具对象的优势:
- 内置的
format方法支持按指定模式格式化Calendar对象,无需手动创建SimpleDateFormat; - 自动适配上下文的
Locale(比如传入西班牙语 Locale 时,月份会显示为西班牙语),而手动创建SimpleDateFormat需额外设置 Locale,否则使用系统默认值。
- 内置的
- 代码简化与可维护性: 移除了控制器中
SimpleDateFormat的创建、格式化等代码,减少重复逻辑;若后续需要修改日期格式(如改为yyyy-MM-dd),只需修改模板中的格式字符串,无需改动后端代码。
拓展:适配 java.time 新 API(JDK8+)
如果项目使用 JDK8 及以上,推荐使用 #temporals 工具对象处理 LocalDateTime/LocalDate 等新日期类型,更符合现代开发规范:
java
// 控制器传递 LocalDate 对象
ctx.setVariable("today", LocalDate.now());html
<!-- 模板中格式化 LocalDate -->
<span th:text="${#temporals.format(today,'dd MMMM yyyy')}">13 May 2011</span>总结
- 使用 Thymeleaf 的
#calendars/#temporals工具对象,可将日期格式化逻辑从控制器移到模板层,简化后端代码,明确前后端职责。 - 工具对象的格式化方法自动适配上下文的 Locale,比手动创建
SimpleDateFormat更简洁、更易适配多语言场景。 - 格式修改仅需调整模板中的格式字符串,无需改动后端代码,提升代码可维护性。
