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