初識FreeMarker

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 &amp; Jerry
TOM &amp; JERRY

Interpolation(插值)
 Interpolation有兩種類型:
通用Interpolation:${expr}
 數字Interpolation:#{expr}或#{expr; format}
 注意:Interpolation只能用於文本部分
 通用Interpolation
 插入字符串值:直接輸出表達式結果
 插入數字值:根據缺省格式(由#setting指令設置)將表達式結果轉換成文本
輸出;能夠使用內建函數string格式化單個Interpolation

5、在模板中定義變量

在模板中定義的變量有三種類型:
plain變量:能夠在模板的任何地方訪問,包括使用include指令插入
的模板,使用assign指令建立和替換
 局部變量:在宏定義體中有效,使用local指令建立和替換
 循環變量:只能存在於指令的嵌套內容,由指令(如list)自動建立;
宏的參數是局部變量,而不是循環變量
局部變量隱藏(而不是覆蓋)同名的plain變量;循環變量隱藏同名的局部
變量和plain變量

 

 

未完待續。。。

相關文章
相關標籤/搜索