Scalars

有 4 种标量类型:

  • Boolean

  • Number

  • String

  • 类日期(子类型:日期(无时间部分),时间或日期时间)

每个标量类型都有一个TemplateTypeModel接口,其中Type是该类型的名称。这些接口仅定义一种方法:type getAsType();。这将返回 Java 类型(分别为booleanNumberStringDate)的变量的值。

Note:

出于历史原因,字符串标量的接口称为TemplateScalarModel,而不是TemplateStringModel。 (这是因为在早期的 FreeMarker 中,字符串是唯一的标量.)

这些接口的简单实现在freemarker.template包中具有SimpleType类名。但是,没有SimpleBooleanModel;要表示布尔值,可以使用TemplateBooleanModel.TRUETemplateBooleanModel.FALSE单例。

Note:

由于历史原因,字符串标量的类称为SimpleScalar而不是SimpleString

标量在 FTL 中是不变的。当您在模板中设置变量的值时,请将TemplateTypeModel实例替换为另一个实例,并且不要更改存储在原始实例中的值。

“类似日期”类型的困难

类似于日期的类型存在复杂性,因为 Java API 通常不会区分仅存储日期部分(2003 年 4 月 4 日),仅存储时间部分(10:19:18 PM)或两者(四月)的java.util.Date -s。 2003 年 4 月 10 日 19:19:18)。为了正确地将值显示为文本(或执行某些其他操作),FreeMarker 必须知道java.util.Date的哪些部分存储了有意义的信息,以及未使用的部分(通常为 0 标注)。不幸的是,该信息通常仅在值来自数据库时才可用,因为大多数数据库具有单独的日期,时间和日期时间(又称时间戳)类型,并且java.sql具有 3 个对应的java.util.Date子类。

TemplateDateModel接口有两种方法:java.util.Date getAsDate()int getDateType()。此接口的典型实现是存储java.util.Date对象,以及一个告诉子类型的整数。此整数的值必须是TemplateDateModel接口中的常量:DATETIMEDATETIMEUNKNOWN

大约UNKNOWNjava.langjava.util类通常会自动转换为ObjectWrapperTemplateModel实现(请参见前面的对象包装)。如果对象包装程序必须包装java.util.Date,而不是java.sql date 类的实例,则无法确定子类型是什么,因此它使用UNKNOWN。以后,如果模板必须使用此变量,并且该操作需要该子类型,它将以错误停止。为了避免这种情况,对于有问题的变量,模板作者必须使用内置日期,时间或日期时间(如lastUpdated?datetime)显式指定子类型。请注意,如果您将string内置使用带格式参数的foo?string["MM/dd/yyyy"],则 FreeMarker 不需要知道该子类型。