FreeMark除了基本數(shù)據(jù)類型之外弓颈,還有類似于java對象的類型叫容器,主要分為以下三種:
- 哈希表
- 序列
- 集
哈希表從java角度來說翅帜,可以是普通的對象荣德,也可以是HashMap
闷煤。當(dāng)是普通的對象的時候,直接Object.value
這種形式調(diào)用即可涮瞻,但當(dāng)是java里面的HashMap
的時候鲤拿,尤其數(shù)據(jù)量比較多的時候,就必須按照鍵值對的形式來獲取數(shù)據(jù):
myMap[myKey]
但是署咽,這里有一個比較隱含的條件就是:myKey
必須是字符串近顷,否則freeMark就會自動的將非字符串的鍵轉(zhuǎn)換為字符串,然后再獲取myKey對應(yīng)的value宁否,
文檔里是這么描述原因的:
FreeMarker 模板語言( FTL)的“哈希表”類型和 Java 的 Map 是不同的窒升。 FTL 的哈希表也是一個關(guān)聯(lián)數(shù)組,但是它僅僅使用字符串的鍵慕匠。這是因為它是為子變量而引的(比如user.password 中的 password饱须,它和 user["password"]是相同的),而變量名是字符串台谊。
這里隱式的自動轉(zhuǎn)換會帶來一個嚴(yán)重的問題冤寿,比如java中map是這么定義的:
Map<Long, Object> myMap = new HashMap<~>();
此時,在freeMark中寫myMap(myLong)
就會報錯青伤,因為隱式轉(zhuǎn)換為字符形式的時候,會自動加分隔符 ,
,比如123345
就會被轉(zhuǎn)換為"123,45"
,從而導(dǎo)致錯誤的myKey的產(chǎn)生殴瘦,獲取不到value而報錯狠角。
解決辦法,調(diào)用c方法轉(zhuǎn)換:
myMap(myLong?c)
通常來說蚪腋,也是不推薦自動隱式轉(zhuǎn)換的丰歌。比如姨蟋,如果你在Map中使用Integer
類型的鍵,那么你就必須書寫${myMap.get(123?int)}
這樣子立帖。