Alfresco 5.0d CE中FreeMarker无法插值NativeDate类型日期值求助
解决Alfresco 5.0d CE中FreeMarker模板处理NativeDate的问题
这个问题我之前在Alfresco开发中也碰到过——本质是FreeMarker只识别Java标准的java.util.Date(或Calendar)类型,而org.mozilla.javascript.NativeDate是Rhino JavaScript引擎的日期对象,FreeMarker既不会自动转换它,也无法对其使用?date/?time/?datetime这些内置方法,所以直接插值才会输出对象的toString形式。
给你两种靠谱的解决办法:
方法1:在Web脚本控制器中转换为Java Date
如果你的Web脚本用的是JavaScript控制器,直接把NativeDate转换成Java标准Date再传入模型是最稳妥的方式:
// JavaScript控制器代码示例 // 假设var.startDate是你的NativeDate对象 var javaStartDate = new java.util.Date(var.startDate.getTime()); model.startDate = javaStartDate;
之后在FreeMarker模板里就能正常使用日期格式化功能了:
<!-- 格式化完整日期时间 --> ${startDate?datetime('yyyy-MM-dd HH:mm:ss')} <!-- 仅显示日期部分 --> ${startDate?date('yyyy-MM-dd')} <!-- 仅显示时间部分 --> ${startDate?time('HH:mm:ss')}
方法2:直接在FreeMarker模板内转换
如果不想修改控制器代码,也可以在模板里直接处理NativeDate。利用NativeDate的getTime()方法获取时间戳,再用FreeMarker的.new方法创建Java Date对象:
<#-- 先判断对象是否存在,避免空指针 --> <#if var.startDate??> <#assign javaStartDate = .new("java.util.Date", var.startDate.getTime())> 开始时间:${javaStartDate?datetime('yyyy-MM-dd HH:mm:ss')} <#else> 开始时间:未设置 </#if>
补充说明
- 两种方法的核心都是把NativeDate转换成Java的
java.util.Date,因为FreeMarker的日期内置方法只对Java标准日期类型生效。 - 如果你的Web脚本用的是Java控制器,那直接在后端把任何日期对象转换成
java.util.Date再传入模型即可,不需要额外处理。
内容的提问来源于stack exchange,提问作者Dmitriy Korobkov
相关产品推荐
相关产品推荐

