1. 程式人生 > >freemarker 模板

freemarker 模板

檢索 cape color span 不同 tom 一個 alt sign

1 整體結構

模板(FTL 編程)是由例如以下部分混合而成的:
Text 文本:文本會照著原樣來輸出。
Interpolation 插值:這部分的輸出會被計算的值來替換。插值由${和}所分隔(或者#{和}。這樣的風格已經不建議再使用了)。
FTL tags 標簽:FTL 標簽和 HTML 標簽非常相似,可是它們卻是給 FreeMarker 的指示,並且不會打印在輸出內容中。
Comments 凝視:FTL 的凝視和 HTML 的凝視也非常相似,但它們是由<#--和-->來分隔的。凝視會被 FreeMarker 所忽略。更不會在輸出內容中顯示。


2 指令

使用 FTL 標簽來調用 directives 指令,比方調用 list 指令。

指令有兩種類型:提前定義指令和用戶自己定義指令。對於用戶自己[email protected]#

更深的差別在於假設指令沒有嵌套內容。那麽必須這麽使用 <@mydirective parameters />而提前定義指定則為<#directive something>

FreeMarker 能夠不須要#來理解提前定義指令(比方<if user == "Big Joe">...</if>)。

而我們不建議這樣來使用。



3 表達式
當須要給插值或者指令參數提供值時,能夠使用變量或其它復雜的表達式。

比如。我們設 x 為 8。y 為 5,那麽(x+y)/2 的值就會被處理成數字類型的值 6.5

當給插值提供值時:插值的使用方式為${expression}

當給指令參數提供值時:在入門章節我們已經看到 if 指令的使用了。

這個指令的語法是:<#if expression>...</#if>。

這裏的表達式計算結果必須是布爾類型的。


高速瀏覽(備忘單)

技術分享

技術分享


直接確定值

_1 字符串

假設文本本身包括用於字符引用的引號(雙引號”或單引號’)或反斜杠時。應該在它們的前面再加一個反斜杠,這就是轉義。

轉義同意你直接在文本中輸入不論什麽字符。也包括反斜杠。

以下的表格是 FreeMarker 支持的全部轉義字符。

技術分享


原生字符串:在原生字符串中。反斜杠和${沒有特殊的含義,它們被視為普通的字符。

為了表明字符串是原生字符串,在開始的引號或單引號之前放置字母 r,比如:

${r"${foo}"} 
${r"C:\foo\bar"} 
將會打印:
${foo} 
C:\foo\bar

_2 數字 輸入不帶引號的數字就能夠直接指定一個數字。必須使用點作為小數的分隔符而不能是
其它的分組分隔符。

_3 布爾值 直接寫 true 或 false 就表征一個布爾值了,不需使用引號。


_4 序列
指定一個文字的序列,使用逗號來分隔當中的每一個子變量,然後把整個列表放到方括號裏。比如:

<#list ["winter", "spring", "summer", "autumn"] as x> 
${x} 
</#list>
列表中的項目是表達式,那麽也能夠這樣做:[2 + 2, [1, 2, 3, 4], "whatnot"],當中第一個子變量是數字 4,第二個子變量是一個序列。第三個子變量是字符串”whatnot”。 也能夠用 start..end 定義存儲數字範圍的序列,這裏的 start 和 end 是處理數
字值表達式,比方 2..5 和[2, 3, 4, 5]是同樣的,可是使用前者會更有效率(內存占用少並且速度快)。

能夠看出前者也沒有使用方括號。這樣也能夠用來定義遞減的數字範圍,比方 5..2。(此外。還能夠省略 end,僅僅需 5..就可以,但這樣序列默認包括 5,6,7,8
等遞增量直到無窮大)

_5 哈希表
在模板中指定一個哈希表。就能夠遍歷用逗號分隔開的“鍵/值”對。把列表放到花括號內。鍵和值成對出現並以冒號分隔。看這個樣例:{"name":"green mouse", "price":150}。註意到名字和值都是表達式。可是用來檢索的名字就必須是字符串類型的。



4 檢索變量
_1 頂層變量

為了訪問頂層的變量。能夠簡單地使用變量名。


_2 從哈希表中檢索數據

假設有一個表達式的結果是哈希表,那麽我們能夠使用點和子變量的名字得到它的值.

以下這些演示樣例它們含義都是相等的:book.author.name, book["author"].name, book.author.["name"], book["author"]["name"]

假設我們想 指 定 同一個表達式 的 子變量。那麽還有第二種語法格式 :在方括號裏能夠給出隨意長度字符串的表達式。在上面這個數據模型演示樣例中你還能夠這麽來獲取 title:book[test] :這裏的test是根元素test中的值.

_3 從序列中檢索數據

這和從哈希表中檢索是同樣的。可是你僅僅能使用方括號語法形式來進行,並且方括號內的表達式終於必須是一個數字而不是字符串。在第一章的數據模型演示樣例中,為了獲取第一個動物的名字(記住第一項數字索引是 0 而不是 1)能夠這麽來寫:animals[0].name。


_4 特殊變量

特殊變量是由 FreeMarker 引擎本身定義的,為了使用它們,能夠依照例如以下語法形式來
進行:.variable_name。


通常情況下是不需使用特殊變量,而對專業用戶來說可能用到。

全部特殊變量的說明可
以參見參考手冊。


5 字符串操作

_1 插值(或連接)

能夠在字符串的文字中使用${…}(#{…})。${...}的作用和在文本區的是同樣的。

也能夠使用+號來達到類似的效果。這是比較老的方法,也叫做字符串連接。


_2 獲取一個字符

user[0]

獲取一定範圍內的字符,比方${user[1..4]}和${user[4..]}。然而如今這樣的用法已經被廢棄了,作為它的替代,能夠使用內建
函數 substring。

6 序列操作
_1 連接

序列的連接能夠使用+號來進行,比如:

<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user> 
- ${user} 
</#list> 
- Joe 
- Fred 
- Julia 
- Kate 

_2 序列切分

使 用 [firstindex..lastindex] 可 以 獲 取 序 列 中的一部分 ,這裏的firstindex 和lastindex 表達式的結果是數字。假設seq 存儲序列"a", "b", "c", "d", "e", "f",那麽表達式 seq[1..4]將會是含有"b", "c", "d", "e"的序列(索引為 1 的項是"b",索引為 4 的項是"e")。 lastindex 能夠被省略,那麽這樣將會讀取到序列的末尾。

假設 seq 存儲序列"a", "b", "c", "d", "e", "f",那麽 seq[3..]將是含有"d", "e", "f"的序列。

7 哈希表操作
_1 連接

像連接字符串那樣。也能夠使用+號的方式來連接哈希表。假設兩個哈希表含有鍵同樣的項,那麽在+號右側的哈希表中的項目優先。

<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}> 
- Joe is ${ages.Joe} 
- Fred is ${ages.Fred} 
- Julia is ${ages.Julia} 
Joe is 30 
- Fred is 25 
- Julia is 18

8 算數運算
有時我們僅僅想獲取計算結果的整數部分。這能夠使用內建函數 int 來解決。
${(x/2)?

int} ${1.1?int} ${1.999?int} ${-1.1?

int} ${-1.999?int}


9 比較運算
測試兩個值相等使用=(或者採用 Java 和 C 語言中的==,二者是全然等同的。) 測試兩個值不等使用!=。

FreeMarker 解釋>的時候能夠把它當作 FTL 標簽的結束符。為了避免這樣的問題,不得不將表達式放到括號內:<#if (x > y)>,或者能夠在比較關系處使用>和<:<#if x > y>。

能夠使用 lt 取代<。lte取代<=。gt 取代>,gte 取代>=。 因為歷史遺留的原因,FTL 也支持\lt, \lte, \gt 和 \gte,使用他們和使用不帶反斜杠的效果一樣。

10 邏輯操作

11 內建函數
內建函數以?形式提供變量的不同形式或者其它信息。使用內建函數的語法和訪問哈希表子變量的語法非常像。除了使用?號來取代
點,其它的都一樣。比如得到字符串的大寫形式:user?upper_case。
技術分享
演示樣例:

${test?

html} ${test?

upper_case?

html}

如果字符串 test 存儲”Tom & Jerry”,那麽輸出為:
Tom & Jerry 
TOM & JERRY 

12 方法調用
${repeat("What", 3)} 
將會打印出:
WhatWhatWhat 

13 處理不存在的值

_1 默認值
使用形式 概 覽 : unsafe_expr!default_expr 或 unsafe_expr! 或(unsafe_expr)!default_expr 或(unsafe_expr)!
這個操作符同意你為可能不存在的變量指定一個默認值。

比如,如果以下展示的代碼中沒有名為 mouse 的變量:

${mouse!"No mouse."} 
<#assign mouse="Jerry"> 
${mouse!"No mouse."}
將會輸出
No mouse. 
Jerry 
默認值能夠是不論什麽類型的表達式,也能夠不必是字符串。

你也能夠這麽寫:hits!0或 colors!["red", "green", "blue"]。

默認值表達式的復雜程度沒有嚴格限制。你還能夠這麽來寫:cargo.weight!(item.weight * itemCount + 10) 。

_2 檢測不存在的值
使用形式概覽:unsafe_expr?

?或(unsafe_expr)??

這個操作符告訴我們一個值是否存在。

基於這樣的情況。結果是 true 或 false。
示比例如以下,如果並沒有名為 mouse 的變量:

<#if mouse?

?> Mouse found <#else> No mouse found </#if> Creating mouse... <#assign mouse = "Jerry"> <#if mouse??

> Mouse found <#else> No mouse found </#if>

No mouse found 
Creating mouse... 
 Mouse found

14 括號
括號能夠用來給表達式分組。示比例如以下:
 <#-- 輸出是: --> 
${3 * 2 + 2} <#-- 8 --> 
${3 * (2 + 2)} <#-- 12 --> 
${3 * ((2 + 2) * (1 / 2))} <#-- 6 --> 
${"green " + "mouse"?upper_case} <#-- green MOUSE --> 
${("green " + "mouse")?upper_case} <#-- GREEN MOUSE --> 
<#if !( color = "red" || color = "green")> 
 The color is nor red nor green 
</#if> 

15 表達式中的空格
FTL 忽略表達式中的多余空格

16 操作符的優先級

插值
插值的使用語法是:${expression}。expression 能夠是全部種類的表達式(比方${100 + x})。


插值是用來給插入詳細值然後轉換為文本(字符串)。插值只能夠在兩種位置使用:
文本區(如<h1>Hello ${name}!</h1> )和字符串表達式(如<#include "/footer/${company}.html">)中。

假設插值在文本區(也就是說。不再字符串表達式中)。假設 escapse 指令起作用了,即將被插入的字符串會被自己主動轉義。

<#escape x as x?html> 
 ... 
 <p>Title: ${book.title}</p> 
 <p>Description: 
<#noescape>${book.description}</#noescape></p> 
 <h2>Comments:</h2> 
 <#list comments as comment> 
 <div class="comment"> 
 ${comment} 
 </div> 
 </#list> 
 ... 
</#escape>







freemarker 模板