freeMark的Map取值问题

https://www.jianshu.com/p/289e15a49f56

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)}这样子。



作者:杨比轩
链接:https://www.jianshu.com/p/289e15a49f56
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自www.cnblogs.com/linus-tan/p/11103923.html