1、什麼是FreeMarker?html
FreeMarker基於設計者和程序員是具備不一樣專業技能的不一樣個體的觀念
他們是分工勞動的:設計者專一於表示——建立HTML文件、圖片、Web頁面的其它可
視化方面;程序員建立系統,生成設計頁面要顯示的數據
常常會遇到的問題是:在Web頁面(或其它類型的文檔)中顯示的信息在設計頁面時
是無效的,是基於動態數據的
在這裏,你能夠在HTML(或其它要輸出的文本)中加入一些特定指令,FreeMarker會
在輸出頁面給最終用戶時,用適當的數據替代這些代碼python
1 <html> 2 <head> 3 <title>Welcome!</title> 4 </head> 5 <body> 6 <h1>Welcome ${user}!</h1> 7 <p>Our latest product: 8 <a href="${latestProduct.url}">${latestProduct.name}</a>! 9 </body> 10 </html>
這個例子是在簡單的HTML中加入了一些由${…}包圍的特定代碼,這些特定代碼是
FreeMarker的指令,而包含FreeMarker的指令的文件就稱爲模板(Template)
至於user、latestProduct.url和latestProduct.name來自於數據模型(data model)
數據模型由程序員編程來建立,向模板提供變化的信息,這些信息來自於數據庫、文件,
甚至於在程序中直接生成
模板設計者不關心數據從那兒來,只知道使用已經創建的數據模型程序員
因此 模版+數據模型=輸出數據庫
當FreeMarker將上面的數據模型合併到模板中,就建立了下面的輸出編程
1 <html> 2 <head> 3 <title>Welcome!</title> 4 </head> 5 <body> 6 <h1>Welcome Big Joe!</h1> 7 <p>Our latest product: 8 <a href="products/greenmouse.html">green mouse</a>! 9 </body> 10 </html>
2、什麼是數據模型?函數
典型的數據模型是樹型結構,能夠任意複雜和深層次,以下面的例子:
(root)
|
+- animals
| |
| +- mouse
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- elephant
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- python
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- test = "It is a test"
|
+- whatnot
|
+- because = "don't know"
相似於目錄的變量稱爲hashes,包含保存下級變量的惟一的查詢名字
相似於文件的變量稱爲scalars,保存單值
scalars保存的值有兩種類型:字符串(用引號括起,能夠是單引號或雙引號)和數字
(不要用引號將數字括起,這會做爲字符串處理)
對scalars的訪問從root開始,各部分用「.」分隔,如animals.mouse.price
另一種變量是sequences,和hashes相似,只是不使用變量名字,而使用數字索引,
以下面的例子:ui
(root)
|
+- animals
| |
| +- (1st)
| | |
| | +- name = "mouse"
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- (2nd)
| | |
| | +- name = "elephant"
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- (3rd)
| |
| +- name = "python"
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- whatnot
|
+- fruits
|
+- (1st) = "orange"
|
+- (2nd) = "banana"
這種對scalars的訪問使用索引,如animals[0].name
編碼
3、什麼是模版?url
在FreeMarker模板中能夠包括下面三種特定部分:
${…}或#{...}:稱爲interpolations(插值),FreeMarker會在輸出時用實際值進行替代
FTL標記(FreeMarker模板語言標記):相似於HTML標記,爲了與HTML標記
區分,用#開始(有些以@開始,在後面敘述)
註釋:包含在<#--和-->(而不是<!--和-->)之間
下面是一些使用指令的例子:
spa
下面是一些使用指令的例子:
if指令
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#else>
Pythons are not cheaper than elephants today.
</#if>
list指令
<p>We have these animals:
<table border=1>
<tr><th>Name<th>Price
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
</table>
include指令
1 <html> 2 <head> 3 <title>Test page</title> 4 </head> 5 <body> 6 <h1>Test page</h1> 7 <p>Blah blah... 8 <#include "/copyright_footer.html"> 9 </body> 10 </html>
注意事項:
FTL區分大小寫,因此list是正確的FTL指令,而List不是;${name}和$
{NAME}是不一樣的
Interpolation只能在文本中使用
FTL標記不能位於另外一個FTL標記內部
註釋能夠位於FTL標記和Interpolation內部
4、FreeMarker指令
在FreeMarker中,使用FTL標記引用指令
有三種FTL標記,這和HTML標記是相似的:
開始標記:<#directivename parameters>
結束標記:</#directivename>
空內容指令標記:<#directivename parameters/>
有兩種類型的指令:預約義指令和用戶定義指令
用戶定義指令要使用@替換#,如<@mydirective>...</@mydirective>
有一類特殊的字符串稱爲raw字符串,被認爲是純文本,其中的\和{等不
具備特殊含義,該類字符串在引號前面加r,下面是一個例子:
${r"${foo}"}
${r"C:\foo\bar"}
輸出的結果是:
${foo}
C:\foo\bar
字符串的操做
${..}只能用於文本部分,下面的代碼是錯誤的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
應該寫成:
<#if isBig>Wow!</#if>
內建函數
內建函數的用法相似訪問散列的子變量,只是使用「?」替代「.」,下面列出經常使用的
一些函數
字符串使用的:
html:對字符串進行HTML編碼
cap_first:使字符串第一個字母大寫
lower_case:將字符串轉換成小寫
upper_case:將字符串轉換成大寫
trim:去掉字符串先後的空白字符
序列使用的:
size:得到序列中元素的數目
數字使用的:
int:取得數字的整數部分(如-1.9?int的結果是-1)
例子(假設test保存字符串"Tom & Jerry"):
${test?html}
${test?upper_case?html}
輸出結果是:
Tom & Jerry
TOM & JERRY
Interpolation(插值)
Interpolation有兩種類型:
通用Interpolation:${expr}
數字Interpolation:#{expr}或#{expr; format}
注意:Interpolation只能用於文本部分
通用Interpolation
插入字符串值:直接輸出表達式結果
插入數字值:根據缺省格式(由#setting指令設置)將表達式結果轉換成文本
輸出;能夠使用內建函數string格式化單個Interpolation
5、在模板中定義變量
在模板中定義的變量有三種類型:
plain變量:能夠在模板的任何地方訪問,包括使用include指令插入
的模板,使用assign指令建立和替換
局部變量:在宏定義體中有效,使用local指令建立和替換
循環變量:只能存在於指令的嵌套內容,由指令(如list)自動建立;
宏的參數是局部變量,而不是循環變量
局部變量隱藏(而不是覆蓋)同名的plain變量;循環變量隱藏同名的局部
變量和plain變量
未完待續。。。