Scalars
有 4 种标量类型:
-
Boolean
-
Number
-
String
-
类日期(子类型:日期(无时间部分),时间或日期时间)
每个标量类型都有一个TemplateTypeModel
接口,其中Type
是该类型的名称。这些接口仅定义一种方法:type getAsType();
。这将返回 Java 类型(分别为boolean
,Number
,String
和Date
)的变量的值。
Note:
出于历史原因,字符串标量的接口称为TemplateScalarModel
,而不是TemplateStringModel
。 (这是因为在早期的 FreeMarker 中,字符串是唯一的标量.)
这些接口的简单实现在freemarker.template
包中具有SimpleType
类名。但是,没有SimpleBooleanModel
;要表示布尔值,可以使用TemplateBooleanModel.TRUE
和TemplateBooleanModel.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
接口中的常量:DATE
,TIME
,DATETIME
和UNKNOWN
。
大约UNKNOWN
:java.lang
和java.util
类通常会自动转换为ObjectWrapper
的TemplateModel
实现(请参见前面的对象包装)。如果对象包装程序必须包装java.util.Date
,而不是java.sql
date 类的实例,则无法确定子类型是什么,因此它使用UNKNOWN
。以后,如果模板必须使用此变量,并且该操作需要该子类型,它将以错误停止。为了避免这种情况,对于有问题的变量,模板作者必须使用内置日期,时间或日期时间(如lastUpdated?datetime
)显式指定子类型。请注意,如果您将string
内置使用带格式参数的foo?string["MM/dd/yyyy"]
,则 FreeMarker 不需要知道该子类型。