#templates #datetime #freemarker #pojo #pretty-print
#шаблоны #дата и время #freemarker #pojo #pretty-печать
Вопрос:
Я пытаюсь напечатать текущую дату, когда шаблон активирован. Я прочитал, что мне нужно передать новый Java-объект Date () в шаблон, но я не знаю, как это сделать или куда поместить его в коде.
Кто-нибудь знает, как передать объект Java в шаблон в этом случае?
Спасибо!!
Ответ №1:
На самом деле вам не нужно передавать new Date()
в свой шаблон, потому что размещение метки времени в выходных данных шаблона является довольно распространенным явлением, и поэтому FreeMarker предоставляет специальную переменную с именем .now
, которая возвращает текущую дату и время. Вы можете использовать это в своем шаблоне следующим образом:
Page generated: ${.now}
(FreeMarker также содержит различные встроенные модули для форматирования дат:http://freemarker.org/docs/ref_builtins_date.html )
Обновление: Работает только с последней версией FreeMarker, 2.3.17.
Комментарии:
1. Спасибо за ваш ответ, но я получаю эту ошибку: ParseException: Неизвестная встроенная переменная: now
2. Я делаю это с помощью ${content.metaData.modificationDate?string.short}. Content.metaData.modificationDate предоставляет мне последнюю модификацию этого шаблона, которая в значительной степени является тем, что мне нужно.
3. Специальная переменная
.now
была введена в версии 2.3.17 (см. freemarker.org/docs/versions_2_3_17.html ), который был выпущен около недели назад. Если вы не можете обновить, вам придется передать текущую дату в модель данных, например, как часть вашей корневой хэш-карты (см. freemarker.org/docs/pgui_quickstart_createdatamodel.html и freemarker.org/docs/pgui_quickstart_merge.html для получения подробной информации, если вы еще не знаете эти вещи).
Ответ №2:
${.now}
это идеальный ответ. Просто хотел добавить несколько других способов получения прямых значений из date
#-- Predefined format names: -->
${openingTime?string.short}
${openingTime?string.medium}
${openingTime?string.long}
${openingTime?string.full}
${openingTime?string.xs} <#-- XSD xs:time -->
${openingTime?string.iso} <#-- ISO 8601 time -->
${.now?string.short}
${.now?string.medium}
${.now?string.long}
${.now?string.full}
${.now?string.xs} <#-- XSD xs:date -->
${.now?string.iso} <#-- ISO 8601 date -->
${.now?string.short}
${.now?string.medium}
${.now?string.long}
${.now?string.full}
${.now?string.medium_short} <#-- medium date, short time -->
${.now?string.xs} <#-- XSD xs:dateTime -->
${.now?string.iso} <#-- ISO 8601 combined date and time -->
<#-- Programmer-defined named format (@ name): -->
${.now?string.@fileDate}
<#-- Advanced ISO 8601 and XSD formatting: -->
${.now?string.iso_m_u}
${.now?string.xs_ms_nz}
<#-- SimpleDateFormat patterns: -->
${.now?string["dd.MM.yyyy, HH:mm"]}
${.now?string["EEEE, MMMM dd, yyyy, hh:mm a '('zzz')'"]}
${.now?string["EEE, MMM d, ''yy"]}
${.now?string.yyyy} <#-- Same as ${.now?string["yyyy"]} -->
выведет
01:45 PM
01:45:09 PM
01:45:09 PM PST
01:45:09 PM PST
13:45:09-08:00
13:45:09-08:00
2/20/07
Apr 20, 2007
April 20, 2007
Friday, April 20, 2007
2007-02-20-08:00
2007-02-20
2/20/07 01:45 PM
Feb 20, 2007 01:45:09 PM
February 20, 2007 01:45:09 PM PST
Friday, February 20, 2007 01:45:09 PM PST
Feb 8, 2003 9:24 PM
2007-02-20T13:45:09-08:00
2007-02-20T13:45:09-08:00
Apr/20/2007 13:45
2007-02-20T21:45Z
2007-02-20T13:45:09.000
08.04.2003 21:24
Tuesday, April 08, 2003, 09:24 PM (PDT)
Tue, Apr 8, '03
2003
Комментарии:
1. Хорошая (на самом деле нет) копия-вставка из официальной документации. Вы могли бы хотя бы вставить ссылку
2. Я взял это из руководства, обычно я размещаю ссылку, не уверен, почему я пропустил это
Ответ №3:
Используйте ObjectConstructor API Freemarker для создания объекта календаря и объекта форматирования, затем объедините их для печати даты:
<#-- Create constructor object -->
<#assign objectConstructor = "freemarker.template.utility.ObjectConstructor"?new()>
<#-- Call calendar constructor -->
<#assign clock = objectConstructor("java.util.GregorianCalendar")>
<#-- Call formatter constructor -->
<#assign mmddyy = objectConstructor("java.text.SimpleDateFormat","MM/dd/yyyy")>
<#-- Call getTime method to return the date in milliseconds-->
<#assign date = clock.getTime()>
<#-- Call format method to pretty print the date -->
<#assign now = mmddyy.format(date)>
<#-- Display date -->
${now}
?new
Встроенная функция в том виде, в каком она была реализована, представляла собой брешь в системе безопасности. Теперь это позволяет создавать экземпляры только объекта Java, который реализуетfreemarker.template.TemplateModel
интерфейс. Если вы хотите функциональность?новая встроенная функция, которая существовала в предыдущих версиях, делает доступным экземплярfreemarker.template.utility.ObjectConstructor
класса для вашего шаблона. Например:
myDataModel.put("objConstructor", new ObjectConstructor());
и затем в шаблоне вы можете сделать это:
<#assign aList = objConstructor("java.util.ArrayList", 100)>)
Ссылки
Комментарии:
1. @mateen Нет проблем. Надеюсь, это сэкономило вам время.