015_插值
1. 插值的使用格式是: ${expression}, 這里的expression可以是所有種類的表達式(比如: ${100 + x})。
2. 插值是用來給表達式插入具體值然后轉(zhuǎn)換為文本(字符串)。插值僅僅可以在兩種位置使用: 在文本區(qū)(比如: <h1>Hello ${name}!</h1>)和字符串表達式(比如: <#include "/footer/${company}.html">)中。
3. ${expression}表達式的結(jié)果必須是字符串, 數(shù)字或者日期、時間、日期-時間值, 因為(默認是這樣)僅僅這些值可以被插值自動轉(zhuǎn)換為字符串。其它類型的值(比如布爾值, 序列)必須"手動地"轉(zhuǎn)換成字符串, 否則就會發(fā)生錯誤, 中止模板執(zhí)行。
4. 一個常犯的錯誤是在不能使用插值的地方使用了它。僅僅在文本區(qū)和字符串中起作用。典型的錯誤使用是<#if ${big}>...</#if>, 這會導致語法錯誤。簡單寫為<#if big>...</#if>即可。
5. escape, noescape指令
5.1. 概要
<#escape identifier as expression>
...
?? <#noescape>...</#noescape>
?? ...
</#escape>
5.2. 當你使用escape指令包圍模板中的一部分時, 在塊中出現(xiàn)的插值(${...})會和轉(zhuǎn)義表達式自動結(jié)合。
5.3. 例如:
<#escape x as x?html>
First name: ${firstName}
?? Last name: ${lastName}
</#escape>
5.4. 上例等同于:
First name: ${firstName?html}
Last name: ${lastName?html}
5.5. 有時需要暫時為一個在轉(zhuǎn)義區(qū)塊中的插值關(guān)閉轉(zhuǎn)義。你可以使用非轉(zhuǎn)義指令<#noescape></#noescape>包含關(guān)閉轉(zhuǎn)義的部分。
<#escape x as x?html>
?? From: ${mailMessage.From}
?? Subject: ${mailMessage.Subject}
?? <#noescape>Message: ${mailMessage.htmlFormattedBody}</#noescape>
?? ...
</#escape>
5.6. 上例等同于:
From: ${mailMessage.From?html}
Subject: ${mailMessage.Subject?html}
Message: ${mailMessage.htmlFormattedBody}
...
6. 字符串類型的插入: 不要忘了轉(zhuǎn)義!
6.1. 如果插值表達式是字符串類型, 強烈建議你使用escape指令和html內(nèi)建函數(shù)來阻止跨站腳本攻擊和非格式良好的html頁面。
7. 數(shù)字類型的插入
7.1. 如果插值表達式是數(shù)字類型, 那么根據(jù)數(shù)字的默認格式(number), 數(shù)值將會轉(zhuǎn)換成字符串。這也許會包含最大的小數(shù), 數(shù)字分組和相似處理的問題。通常程序員應(yīng)該設(shè)置默認的數(shù)字格式(cfg.setNumberFormat("computer");), 而模板設(shè)計者不需要處理它(但可以使用內(nèi)建函數(shù)string 為一個插值來重寫默認數(shù)值格式或者使用setting指令的number_format來設(shè)置)。
8. 日期、時間、日期-時間類型插入
8.1. 如果插值表達式是日期、時間、日期-時間類型, 那么日期中的數(shù)字將會按照默認格式來轉(zhuǎn)換成文本。通常程序員應(yīng)該設(shè)置默認格式(cfg.setDateFormat("yyyy-MM-dd"); cfg.setTimeFormat("HH:mm:ss.SSS"); cfg.setDateTimeFormat("yyyy-MM-dd HH:mm:ss.SSS");), 而頁面設(shè)計者無需處理這一點(當然也可以使用內(nèi)建函數(shù)string 來覆蓋單獨插值的默認格式或者使用setting指令的date_format、time_format和datetime_format來設(shè)置)。
8.2. 為了將日期顯示成文本, FreeMarker必須知道日期中的哪一部分在使用, 也就是說, 如果僅僅日期部分(年, 月, 日)使用或僅僅時間部分(時, 分, 秒, 毫秒)使用或兩部分都用。不幸的是, 由于Java平臺技術(shù)的限制, 自動探測一些變量是不現(xiàn)實的。這時可以找程序員對數(shù)據(jù)模型中可能出問題的變量進行處理。如果找出時間日期變量的哪部分在使用是不太可能的話, 就必須使用FreeMarker內(nèi)建函數(shù)date, time和datetime來識別(比如: ${lastUpdated?datetime}), 否則就會出現(xiàn)錯誤停止執(zhí)行。
9. 布爾類型插入
9.1. 若要使用插值方式來打印布爾值會引起錯誤, 中止模板的執(zhí)行。
9.2. 可以使用setting指令設(shè)置參數(shù)boolean_format來為FreeMarker配置默認的布爾值格式。那么, 直接編寫${married}這樣的代碼就不會有問題了。但在很多應(yīng)用程序中, ?這樣的做法是不推薦使用的, 因為布爾值在不同的地方就應(yīng)該呈現(xiàn)出不同的格式, 同時將格式留作默認值也可以認為是疏忽, 因為這可能導致錯誤產(chǎn)生。
9.3. 程序員也可以進行默認格式設(shè)置(cfg.setBooleanFormat("c");), 但是也不推薦, 原因同上。
9.4. 當想生成JavaScript或其它計算機語言代碼部分時, 那么可以考慮使用${someBoolean?c}("c"代表計算機)來輸出布爾值true/false。請記住?c也可以用來輸出給計算機看的數(shù)字。
總結(jié)
- 上一篇: 008_setting指令
- 下一篇: 016_循环变量内建函数