关于freemarker的classic_compatible属性的使用场景和解决
關(guān)于freemarker的classic_compatible屬性網(wǎng)上資料很多的,不過(guò)大多數(shù)說(shuō)的不是很全面。這里稍微補(bǔ)充一些。
? ? ? ? 在freemarker中的空值的處理,默認(rèn)情況以${xxx}的方式取值會(huì)報(bào)錯(cuò),我們一般都采用${xxx?if_exists} 的方式去處理,煩死人了。經(jīng)過(guò)查資料,很多人都建議使用classic_compatible=true的方式來(lái)處理,目測(cè)單詞的意思應(yīng)該是:“兼容傳統(tǒng)模式”的意思。但是經(jīng)過(guò)使用發(fā)現(xiàn)這個(gè)屬性設(shè)置為true時(shí),也有很多其他問(wèn)題,比如boolean值的處理,比如include指令必須使用絕對(duì)路徑,總之也會(huì)帶來(lái)很多煩人的事情。最后找到源碼,在Freemarker源碼的Configurable類的isClassicCompatible方法上找到了詳細(xì)的注釋,這里翻譯下,不過(guò)本人英語(yǔ)比較差,可能會(huì)有錯(cuò)誤,如果有人不確定可以去看源碼。
? ? ? ?原注釋大意如下:
? ? ? ?該方法返回Freemarker模板解析引擎是否工作在“Classic Compatibile”模式下。如果這個(gè)模式被激活,則Freemarker模板解析引擎將以以下的方式工作:(類似于1.7.x這個(gè)版本的運(yùn)行方式,這個(gè)也是1.7.x的版本被稱為“經(jīng)典的Freemarker”的由來(lái))。(譯者注:以下的1、2、3、4、5、6是譯者自己加的,方便讀者看)
? ? ? ?處理未定義的表達(dá)式,也就是說(shuō)"expr"為null值。
? ? ? ?1、作為像表達(dá)式“<assign varname=expr>”、“${expr}”、“?otherexpr == expr“、“otherexpr != expr”條件表達(dá)式或者是“hash[expr]”表達(dá)式的參數(shù),這個(gè)參數(shù)將被當(dāng)成空字符來(lái)對(duì)待。(譯者注:這里注意空字符和null是不一樣的).
? ? ? ?2、作為“<list expr as item>”、“<foreach item in expr>”這樣的表達(dá)式的參數(shù),其循環(huán)體將不會(huì)被執(zhí)行,和list的長(zhǎng)度為0是一樣的。
? ? ? ?3、作為“<if>”或者其他布爾表達(dá)式命令的參數(shù),空值將被當(dāng)成是false來(lái)處理。非布爾數(shù)據(jù)模型或者邏輯操作數(shù)也可以放在“<if>”表達(dá)式中,空模型(長(zhǎng)度為零的字符串,空的數(shù)組或者h(yuǎn)ash集合)都被當(dāng)成是false來(lái)對(duì)待,其他情況下都被當(dāng)成是true來(lái)處理。
? ? ? ?4、當(dāng)布爾值被當(dāng)成字符串(比如用${...}輸出,或者是和其他字符串連接),true值將被轉(zhuǎn)換成“true”字符串處理,false值將被轉(zhuǎn)換成空字符串。
? ? ? ?5、提供給<list>和<foreach>的標(biāo)量數(shù)據(jù)模型參數(shù)將被當(dāng)成只包含一個(gè)該模型的list來(lái)處理。(譯者注:就是說(shuō),傳給<list>和<foreach>的參數(shù)不是list或者數(shù)組類型的,而是單個(gè)元素,則會(huì)被當(dāng)成只有一個(gè)元素的list或者數(shù)組)
? ? ???6、“<include>”標(biāo)簽的路徑參數(shù)將被作為絕對(duì)路徑處理。(譯者注:這里很多網(wǎng)上的文檔都沒有提過(guò),是本人經(jīng)過(guò)觀察發(fā)現(xiàn)的,然后從源碼和其注釋中找到的。在這種情況下,如果傳入的ftl路徑是相對(duì)路徑,則會(huì)報(bào)找不到文件的異常)。
? ? ? ?在其他方面,甚至是在兼容模式下,這個(gè)Freemaker解析引擎是2.1引擎,你不會(huì)因此而丟掉其他新的功能。
? ? ? 以上就是譯文, 那么如果我們?cè)O(shè)置了全局的classic_compatible屬性,而在某個(gè)頁(yè)面上又不想遵守這個(gè)屬性該怎么辦呢?這樣就可以在當(dāng)前這個(gè)頁(yè)面上采用以下的辦法,讓當(dāng)前的頁(yè)面不再支持傳統(tǒng)模式:<#setting classic_compatible=false>
總結(jié)
以上是生活随笔為你收集整理的关于freemarker的classic_compatible属性的使用场景和解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu下Django环境的搭建
- 下一篇: Ubuntu 下vim中tab键变为4个