• 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
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    css选择器优先级
    内置函数filter和map
    hdu 3068 最长回文 manacher算法(视频)
    hdu 5752 Sqrt Bo
    HDU 2176 取(m堆)石子游戏(Nim)
    HDU 2188 悼念512汶川大地震遇难同胞――选拔志愿者(巴什博奕)
    HDU 2897 邂逅明下(巴什博奕)
    POJ 1740 A New Stone Game(普通博弈)
    HDU 2516 取石子游戏(斐波那契博弈)
    hdu 1361 Parencodings 简单模拟
  • 原文地址:https://www.cnblogs.com/linus-tan/p/11103923.html
Copyright © 2020-2023  润新知