FreeMark除了基本数据类型之外,还有类似于java对象的类型叫容器,主要分为以下三种:
- 哈希表
- 序列
- 集
哈希表从java角度来说,可以是普通的对象,也可以是HashMap
。当是普通的对象的时候,直接Object.value
这种形式调用即可,但当是java里面的HashMap
的时候,尤其数据量比较多的时候,就必须按照键值对的形式来获取数据:
myMap[myKey]
但是,这里有一个比较隐含的条件就是:myKey
必须是字符串,否则freeMark就会自动的将非字符串的键转换为字符串,然后再获取myKey对应的value,
文档里是这么描述原因的:
FreeMarker 模板语言( FTL)的“哈希表”类型和 Java 的 Map 是不同的。 FTL 的哈希表也是一个关联数组,但是它仅仅使用字符串的键。这是因为它是为子变量而引的(比如user.password 中的 password,它和 user["password"]是相同的),而变量名是字符串。
这里隐式的自动转换会带来一个严重的问题,比如java中map是这么定义的:
Map<Long, Object> myMap = new HashMap<~>();
此时,在freeMark中写myMap(myLong)
就会报错,因为隐式转换为字符形式的时候,会自动加分隔符 ,
,比如123345
就会被转换为"123,45"
,从而导致错误的myKey的产生,获取不到value而报错。
解决办法,调用c方法转换:
myMap(myLong?c)
通常来说,也是不推荐自动隐式转换的。比如,如果你在Map中使用Integer
类型的键,那么你就必须书写${myMap.get(123?int)}
这样子。