欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
FreeMarker設計指南(完整整理)_狼的原野

快速入門(mén)

(1)模板 + 數據模型 = 輸出

FreeMarker基于設計者和程序員是具有不同專(zhuān)業(yè)技能的不同個(gè)體的觀(guān)念他們是分工勞動(dòng)的:
設計者專(zhuān)注于表示——創(chuàng )建HTML文件、圖片、Web頁(yè)面的其它可視化方面;
程序員創(chuàng )建系統,生成設計頁(yè)面要顯示的數據。
經(jīng)常會(huì )遇到的問(wèn)題是:在Web頁(yè)面(或其它類(lèi)型的文檔)中顯示的信息在設計頁(yè)面時(shí)是無(wú)效的,是基于動(dòng)態(tài)數據的。在這里,你可以在HTML(或其它要輸出的文本)中加入一些特定指令,FreeMarker會(huì )在輸出頁(yè)面給最終用戶(hù)時(shí),用適當的數據替代這些代碼。


先來(lái)解釋一下freemaker的基本語(yǔ)法了,
<# ... > 中存放所有freemaker的內容,之外的內容全部原樣輸出。
<@ ... /> 是函數調用
兩個(gè)定界符內的內容中,第一個(gè)符號表示指令或者函數名,其后的跟隨參數。freemaker提供的控制包括如下:
<#if condition><#elseif condition><#else> 條件判斷
<#list hash_or_seq as var> 遍歷hash表或者collection(freemaker稱(chēng)作sequence)的成員
<#macro name param1 param2 ... ><#nested param> 宏,無(wú)返回參數
<#function name param1 param2><#return val>函數,有返回參數
var?member_function(...) 用函數對var進(jìn)行轉換,freemaker稱(chēng)為build-ins。實(shí)際內部實(shí)現類(lèi)似member_function(var, ...)
stringA[M .. N] 取子字符串,類(lèi)似substring(stringA, M, N)
{key:value, key2:value2 ...} 直接定義一個(gè)hash表
[item0, item1, item2 ...] 直接定義一個(gè)序列
hash0[key0] 存取hash表中key對應的元素
seq0[5] 存取序列指定下標的元素
<@function1 param0 param1 ... /> 調用函數function1
<@macro0 param0 param1 ; nest_param0 nest_param1 ...> nest_body <
/@macro> 調用宏,并處理宏的嵌套
<#assign var = value > 定義變量并初始化
<#local var = value> 在 macro 或者 function 中定義局部變量并初始化
<#global var = value > 定義全局變量并初始化
${var} 輸出并替換為表達式的值
<#visit xmlnode> 調用macro匹配xmlnode本身及其子節點(diǎn)
<#recurse xmlnode> 調用macro匹配xmlnode的子節點(diǎn)


下面是一個(gè)例子:

<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>
這個(gè)例子是在簡(jiǎn)單的HTML中加入了一些由${…}包圍的特定代碼,這些特定代碼是FreeMarker的指令,而包含FreeMarker的指令的文件就稱(chēng)為模板(Template)。
至于user、latestProduct.url和latestProduct.name來(lái)自于數據模型(data model)。
數據模型由程序員編程來(lái)創(chuàng )建,向模板提供變化的信息,這些信息來(lái)自于數據庫、文件,甚至于在程序中直接生成。
模板設計者不關(guān)心數據從那兒來(lái),只知道使用已經(jīng)建立的數據模型。

下面是一個(gè)可能的數據模型:

(root)
|
+- user = "Big Joe"
|
+- latestProduct
|
+- url = "products/greenmouse.html"
|
+- name = "green mouse"
數據模型類(lèi)似于計算機的文件系統,latestProduct可以看作是目錄。

2、數據模型

(1)基礎

在快速入門(mén)中介紹了在模板中使用的三種基本對象類(lèi)型:scalars、hashes 和sequences,其實(shí)還可以有其它更多的能力:

  • scalars:存儲單值
  • hashes:充當其它對象的容器,每個(gè)都關(guān)聯(lián)一個(gè)唯一的查詢(xún)名字
  • sequences:充當其它對象的容器,按次序訪(fǎng)問(wèn)
  • 方法:通過(guò)傳遞的參數進(jìn)行計算,以新對象返回結果
  • 用戶(hù)自定義FTL標記:宏和變換器

通常每個(gè)變量只具有上述的一種能力,但一個(gè)變量可以具有多個(gè)上述能力,如下面的例子:

(root)
|
+- mouse = "Yerri"
|
+- age = 12
|
+- color = "brown">
mouse既是scalars又是hashes,將上面的數據模型合并到下面的模板:
${mouse}       <#-- use mouse as scalar -->
${mouse.age} <#-- use mouse as hash -->
${mouse.color} <#-- use mouse as hash -->
輸出結果是:
Yerri
12
brown

(2)Scalar變量

Scalar變量存儲單值,可以是:

  • 字符串:簡(jiǎn)單文本,在模板中使用引號(單引號或雙引號)括起
  • 數字:在模板中直接使用數字值
  • 日期:存儲日期/時(shí)間相關(guān)的數據,可以是日期、時(shí)間或日期-時(shí)間(Timestamp);通常情況,日期值由程序員加到數據模型中,設計者只需要顯示它們
  • 布爾值:true或false,通常在<#if …>標記中使用

(3)hashes 、sequences和集合

有些變量不包含任何可顯示的內容,而是作為容器包含其它變量,者有兩種類(lèi)型:

  • hashes:具有一個(gè)唯一的查詢(xún)名字和它包含的每個(gè)變量相關(guān)聯(lián)
  • sequences:使用數字和它包含的每個(gè)變量相關(guān)聯(lián),索引值從0開(kāi)始

集合變量通常類(lèi)似sequences,除非無(wú)法訪(fǎng)問(wèn)它的大小和不能使用索引來(lái)獲得它的子變量;集合可以看作只能由<#list …>指令使用的受限sequences

(4)方法

方法變量通常是基于給出的參數計算值。

下面的例子假設程序員已經(jīng)將方法變量avg放到數據模型中,用來(lái)計算數字平均值:

The average of 3 and 5 is: ${avg(3, 5)}
The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
The average of the price of python and elephant is:
${avg(animals.python.price, animals.elephant.price)}

(5)宏和變換器

宏和變換器變量是用戶(hù)自定義指令(自定義FTL標記),會(huì )在后面講述這些高級特性

(6)節點(diǎn)

節點(diǎn)變量表示為樹(shù)型結構中的一個(gè)節點(diǎn),通常在XML處理中使用,會(huì )在后面的專(zhuān)門(mén)章節中講

3、模板

(1)整體結構

模板使用FTL(FreeMarker模板語(yǔ)言)編寫(xiě),是下面各部分的一個(gè)組合:

  • 文本:直接輸出
  • Interpolation:由${和},或#{和}來(lái)限定,計算值替代輸出
  • FTL標記:FreeMarker指令,和HTML標記類(lèi)似,名字前加#予以區分,不會(huì )輸出
  • 注釋?zhuān)河?lt;#--和-->限定,不會(huì )輸出

下面是以一個(gè)具體模板例子:

<html>
<head>
<title>Welcome!</title>
</head>
<body>
<#-- Greet the user with his/her name -->
<h1>Welcome ${user}!</h1>
<p>We have these animals:
<ul>
<#list animals as being>
<li>${being.name} for ${being.price} Euros
</#list>
</ul>
</body>
</html>

注意事項:

  • FTL區分大小寫(xiě),所以list是正確的FTL指令,而List不是;${name}和${NAME}是不同的
  • Interpolation只能在文本中使用
  • FTL標記不能位于另一個(gè)FTL標記內部,例如:
<#if <#include ‘foo‘>=‘bar‘>...</if>
  • 注釋可以位于FTL標記和Interpolation內部,如下面的例子:
<h1>Welcome ${user <#-- The name of user -->}!</h1>
<p>We have these animals:
<ul>
<#list <#-- some comment... --> animals as <#-- again... --> being>
...
  • 余的空白字符會(huì )在模板輸出時(shí)移除

(2)指令

在FreeMarker中,使用FTL標記引用指令。有三種FTL標記,這和HTML標記是類(lèi)似的:

  • 開(kāi)始標記:<#directivename parameters>
  • 結束標記:</#directivename>
  • 空內容指令標記:<#directivename parameters/>

有兩種類(lèi)型的指令:預定義指令和用戶(hù)定義指令。

用戶(hù)定義指令要使用@替換#,如<@mydirective>...</@mydirective>(會(huì )在后面講述)。

FTL標記不能夠交叉,而應該正確的嵌套,如下面的代碼是錯誤的:

<ul>
<#list animals as being>
<li>${being.name} for ${being.price} Euros
<#if use = "Big Joe">
(except for you)
</#list>
</#if> <#-- WRONG! -->
</ul>
如果使用不存在的指令,FreeMarker不會(huì )使用模板輸出,而是產(chǎn)生一個(gè)錯誤消息。

FreeMarker會(huì )忽略FTL標記中的空白字符,如下面的例子:

<#list
animals as
being
>
${being.name} for ${being.price} Euros
</#list >
但是,<、</和指令之間不允許有空白字符。

(3)表達式

直接指定值

  • 字符串
使用單引號或雙引號限定

如果包含特殊字符需要轉義,如下面的例子:

${"It‘s \"quoted\" and
this is a backslash: \\"}

${‘It\‘s "quoted" and
this is a backslash: \\‘}
輸出結果是:
It‘s "quoted" and
this is a backslash: \

It‘s "quoted" and
this is a backslash: \
下面是支持的轉義序列:
轉義序列 含義
\" 雙引號(u0022)
\‘ 單引號(u0027)

反斜杠(u005C)
\n 換行(u000A)
\r Return (u000D)
\t Tab (u0009)
\b Backspace (u0008)
\f Form feed (u000C)
\l <
\g >
\a &
\{ {
\xCode 4位16進(jìn)制Unicode代碼

有一類(lèi)特殊的字符串稱(chēng)為raw字符串,被認為是純文本,其中的\和{等不具有特殊含義,該類(lèi)字符串在引號前面加r,下面是一個(gè)例子:

${r"${foo}"}

${r"C:\foo\bar"}
輸出的結果是:
${foo}

C:\foo\bar
  • 數字

直接輸入,不需要引號

精度數字使用“.”分隔,不能使用分組符號

目前版本不支持科學(xué)計數法,所以“1E3”是錯誤的

不能省略小數點(diǎn)前面的0,所以“.5”是錯誤的

數字8、+8、08和8.00都是相同的

  • 布爾值

true和false,不使用引號

  • 序列

由逗號分隔的子變量列表,由方括號限定,下面是一個(gè)例子:

<#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>
輸出的結果是:
winter
spring
summer
autumn
列表的項目是表達式,所以可以有下面的例子:
[2 + 2, [1, 2, 3, 4], "whatnot"]
可以使用數字范圍定義數字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意數字范圍沒(méi)有方括號

可以定義反遞增的數字范圍,如5..2

  • 散列(hash)
由逗號分隔的鍵/值列表,由大括號限定,鍵和值之間用冒號分隔,下面是一個(gè)例子:
{"name":"green mouse", "price":150}
鍵和值都是表達式,但是鍵必須是字符串

獲取變量

  • 頂層變量: ${variable},變量名只能是字母、數字、下劃線(xiàn)、$、@和#的組合,且不能以數字開(kāi)頭
  • 從散列中獲取數據

可以使用點(diǎn)語(yǔ)法或方括號語(yǔ)法,假設有下面的數據模型:

(root)
|
+- book
| |
| +- title = "Breeding green mouses"
| |
| +- author
| |
| +- name = "Julia Smith"
| |
| +- info = "Biologist, 1923-1985, Canada"
|
+- test = "title"
下面都是等價(jià)的:
book.author.name
book["author"].name
book.author.["name"]
book["author"]["name"]
使用點(diǎn)語(yǔ)法,變量名字有頂層變量一樣的限制,但方括號語(yǔ)法沒(méi)有該限制,因為名字是任意表達式的結果
  • 從序列獲得數據:和散列的方括號語(yǔ)法語(yǔ)法一樣,只是方括號中的表達式值必須是數字;注意:第一個(gè)項目的索引是0

序列片斷:使用[startIndex..endIndex]語(yǔ)法,從序列中獲得序列片斷(也是序列);startIndex和endIndex是結果為數字的表達式

  • 特殊變量:FreeMarker內定義變量,使用.variablename語(yǔ)法訪(fǎng)問(wèn)

字符串操作

  • Interpolation(或連接操作)

可以使用${..}(或#{..})在文本部分插入表達式的值,例如:

${"Hello ${user}!"}

${"${user}${user}${user}${user}"}
可以使用+操作符獲得同樣的結果
${"Hello " + user + "!"}

${user + user + user + user}
${..}只能用于文本部分,下面的代碼是錯誤的:
<#if ${isBig}>Wow!</#if>

<#if "${isBig}">Wow!</#if>
應該寫(xiě)成:
<#if isBig>Wow!</#if>
  • 子串

例子(假設user的值為“Big Joe”):

${user[0]}${user[4]}

${user[1..4]}
結果是(注意第一個(gè)字符的索引是0):
BJ

ig J
序列操作
  • 連接操作:和字符串一樣,使用+,下面是一個(gè)例子:
<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>
輸出結果是:
- Joe
- Fred
- Julia
- Kate
散列操作
  • 連接操作:和字符串一樣,使用+,如果具有相同的key,右邊的值替代左邊的值,例如:
<#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
算術(shù)運算
  • +、-、×、/、%,下面是一個(gè)例子:
${x * x - 100}
${x / 2}
${12 % 10}
輸出結果是(假設x為5):
-75
2.5
2
操作符兩邊必須是數字,因此下面的代碼是錯誤的:
${3 * "5"} <#-- WRONG! -->  
使用+操作符時(shí),如果一邊是數字,一邊是字符串,就會(huì )自動(dòng)將數字轉換為字符串,例如:
${3 + "5"}  
輸出結果是:
35
使用內建的int(后面講述)獲得整數部分,例如:
${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}
輸出結果是(假設x為5):
2
1
1
-1
-1
  • 比較操作符

使用=(或==,完全相等)測試兩個(gè)值是否相等,使用!= 測試兩個(gè)值是否不相等

=和!=兩邊必須是相同類(lèi)型的值,否則會(huì )產(chǎn)生錯誤,例如<#if 1 = "1">會(huì )引起錯誤

Freemarker是精確比較,所以對"x"、"x "和"X"是不相等的

對數字和日期可以使用<、<=、>和>=,但不能用于字符串

由于Freemarker會(huì )將>解釋成FTL標記的結束字符,所以對于>和>=可以使用括號來(lái)避免這種情況,例如<#if (x > y)>

另一種替代的方法是,使用lt、lte、gt和gte來(lái)替代<、<=、>和>=

  • 邏輯操作符

&&(and)、||(or)、!(not),只能用于布爾值,否則會(huì )產(chǎn)生錯誤

例子:

<#if x < 12 && color = "green">
We have less than 12 things, and they are green.
</#if>
<#if !hot> <#-- here hot must be a boolean -->
It‘s not hot.
</#if>
  • 內建函數

內建函數的用法類(lèi)似訪(fǎng)問(wèn)散列的子變量,只是使用“?”替代“.”,下面列出常用的一些函數

    • 字符串使用的:

html:對字符串進(jìn)行HTML編碼

cap_first:使字符串第一個(gè)字母大寫(xiě)

lower_case:將字符串轉換成小寫(xiě)

upper_case:將字符串轉換成大寫(xiě)

trim:去掉字符串前后的空白字符

    • 序列使用的:

size:獲得序列中元素的數目

    • 數字使用的:

int:取得數字的整數部分(如-1.9?int的結果是-1)

例子(假設test保存字符串"Tom & Jerry"):

${test?html}
${test?upper_case?html}
輸出結果是:
Tom & Jerry
TOM & JERRY
  • 操作符優(yōu)先順序
操作符組 操作符
后綴 [subvarName] [subStringRange] . (methodParams)
一元 +expr、-expr、!
內建 ?
乘法 *、 / 、%
加法 +、-
關(guān)系 <、>、<=、>=(lt、lte、gt、gte)
相等 ==(=)、!=
邏輯and &&
邏輯or 雙豎線(xiàn)
數字范圍 ..

(4)Interpolation

Interpolation有兩種類(lèi)型:

  1. 通用Interpolation:${expr}
  1. 數字Interpolation:#{expr}或#{expr; format}

注意:Interpolation只能用于文本部分

  • 通用Interpolation

插入字符串值:直接輸出表達式結果

插入數字值:根據缺省格式(由#setting指令設置)將表達式結果轉換成文本輸出;可以使用內建函數string格式化單個(gè)Interpolation,下面是一個(gè)例子:

<#setting number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
輸出結果是:
$42.00
$42.00
42
$42.00
4,200%
插入日期值:根據缺省格式(由#setting指令設置)將表達式結果轉換成文本輸出;可以使用內建函數string格式化單個(gè)Interpolation,下面是一個(gè)使用格式模式的例子:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ‘‘yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a ‘(‘zzz‘)‘")}
輸出的結果類(lèi)似下面的格式:
2003-04-08 21:24:44 Pacific Daylight Time
Tue, Apr 8, ‘03
Tuesday, April 08, 2003, 09:24:44 PM (PDT)
插入布爾值:根據缺省格式(由#setting指令設置)將表達式結果轉換成文本輸出;可以使用內建函數string格式化單個(gè)Interpolation,下面是一個(gè)例子:
<#assign foo=true/>
${foo?string("yes", "no")}
輸出結果是:
yes
  • 數字Interpolation的#{expr; format}形式可以用來(lái)格式化數字,format可以是:

mX:小數部分最小X位

MX:小數部分最大X位

例子:

<#-- If the language is US English the output is: -->
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 2.58 -->
#{y; M2} <#-- 4 -->
#{x; m1} <#-- 2.6 -->
#{y; m1} <#-- 4.0 -->
#{x; m1M2} <#-- 2.58 -->
#{y; m1M2} <#-- 4.0 -->

4、雜項

(1)用戶(hù)定義指令

宏和變換器變量是兩種不同類(lèi)型的用戶(hù)定義指令,它們之間的區別是宏是在模板中使用macro指令定義,而變換器是在模板外由程序定義,這里只介紹宏

  • 基本用法

宏是和某個(gè)變量關(guān)聯(lián)的模板片斷,以便在模板中通過(guò)用戶(hù)定義指令使用該變量,下面是一個(gè)例子:

<#macro greet>
<font size="+2">Hello Joe!</font>
</#macro>
作為用戶(hù)定義指令使用宏變量時(shí),使用@替代FTL標記中的#
<@greet></@greet>
如果沒(méi)有體內容,也可以使用:
<@greet/>
  • 參數

在macro指令中可以在宏變量之后定義參數,如:

<#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
可以這樣使用這個(gè)宏變量:
<@greet person="Fred"/> and <@greet person="Batman"/> 
輸出結果是:
  <font size="+2">Hello Fred!</font>

and <font size="+2">Hello Batman!</font>

宏的參數是FTL表達式,所以下面的代碼具有不同的意思:

<@greet person=Fred/>
這意味著(zhù)將Fred變量的值傳給person參數,該值不僅是字符串,還可以是其它類(lèi)型,甚至是復雜的表達式

可以有多參數,下面是一個(gè)例子:

<#macro greet person color>
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
可以這樣使用該宏變量:
<@greet person="Fred" color="black"/> 
其中參數的次序是無(wú)關(guān)的,因此下面是等價(jià)的:
<@greet color="black" person="Fred"/>
只能使用在macro指令中定義的參數,并且對所有參數賦值,所以下面的代碼是錯誤的:
<@greet person="Fred" color="black" background="green"/>
<@greet person="Fred"/>
可以在定義參數時(shí)指定缺省值,如:
<#macro greet person color="black">
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
這樣<@greet person="Fred"/>就正確了

宏的參數是局部變量,只能在宏定義中有效

  • 嵌套內容

用戶(hù)定義指令可以有嵌套內容,使用<#nested>指令執行指令開(kāi)始和結束標記之間的模板片斷

例子:

<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</tr></td></table>
</#macro>
這樣使用該宏變量:
<@border>The bordered text</@border>
輸出結果:
  <table border=4 cellspacing=0 cellpadding=4><tr><td>
The bordered text
</tr></td></table>

<#nested>指令可以被多次調用,例如:

<#macro do_thrice>
<#nested>
<#nested>
<#nested>
</#macro>
<@do_thrice>
Anything.
</@do_thrice>
輸出結果:
  Anything.
Anything.
Anything.
嵌套內容可以是有效的FTL,下面是一個(gè)有些復雜的例子: <@border> <ul> <@do_thrice> <li><@greet person="Joe"/> </@do_thrice> </ul> </@border> }}} 輸出結果:
  <table border=4 cellspacing=0 cellpadding=4><tr><td>
<ul>
<li><font size="+2">Hello Joe!</font>
<li><font size="+2">Hello Joe!</font>
<li><font size="+2">Hello Joe!</font>
</ul>
</tr></td></table>
宏定義中的局部變量對嵌套內容是不可見(jiàn)的,例如:
<#macro repeat count>
<#local y = "test">
<#list 1..count as x>
${y} ${count}/${x}: <#nested>
</#list>
</#macro>
<@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat>
輸出結果:
    test 3/1: ? ? ?
test 3/2: ? ? ?
test 3/3: ? ? ?
  • 在宏定義中使用循環(huán)變量

用戶(hù)定義指令可以有循環(huán)變量,通常用于重復嵌套內容,基本用法是:作為nested指令的參數傳遞循環(huán)變量的實(shí)際值,而在調用用戶(hù)定義指令時(shí),在<@…>開(kāi)始標記的參數后面指定循環(huán)變量的名字

例子:

<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
</#list>
</#macro>
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if>
</@repeat>
輸出結果:
  1. 0.5
2. 1
3. 1.5
4. 2 Last!

指定的循環(huán)變量的數目和用戶(hù)定義指令開(kāi)始標記指定的不同不會(huì )有問(wèn)題

調用時(shí)少指定循環(huán)變量,則多指定的值不可見(jiàn)

調用時(shí)多指定循環(huán)變量,多余的循環(huán)變量不會(huì )被創(chuàng )建

(2)在模板中定義變量

在模板中定義的變量有三種類(lèi)型:

  • plain變量:可以在模板的任何地方訪(fǎng)問(wèn),包括使用include指令插入的模板,使用assign指令創(chuàng )建和替換
  • 局部變量:在宏定義體中有效,使用local指令創(chuàng )建和替換
  • 循環(huán)變量:只能存在于指令的嵌套內容,由指令(如list)自動(dòng)創(chuàng )建

宏的參數是局部變量,而不是循環(huán)變量;局部變量隱藏(而不是覆蓋)同名的plain變量;循環(huán)變量隱藏同名的局部變量和plain變量,下面是一個(gè)例子:

<#assign x = "plain">
1. ${x} <#-- we see the plain var. here -->
<@test/>
6. ${x} <#-- the value of plain var. was not changed -->
<#list ["loop"] as x>
7. ${x} <#-- now the loop var. hides the plain var. -->
<#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->
8. ${x} <#-- it still hides the plain var. -->
</#list>
9. ${x} <#-- the new value of plain var. -->
<#macro test>
2. ${x} <#-- we still see the plain var. here -->
<#local x = "local">
3. ${x} <#-- now the local var. hides it -->
<#list ["loop"] as x>
4. ${x} <#-- now the loop var. hides the local var. -->
</#list>
5. ${x} <#-- now we see the local var. again -->
</#macro>
輸出結果:
1. plain
2. plain
3. local
4. loop
5. local
6. plain
7. loop
8. loop
9. plain2

內部循環(huán)變量隱藏同名的外部循環(huán)變量,如:

<#list ["loop 1"] as x>
${x}
<#list ["loop 2"] as x>
${x}
<#list ["loop 3"] as x>
${x}
</#list>
${x}
</#list>
${x}
</#list>
輸出結果:
  loop 1
loop 2
loop 3
loop 2
loop 1
模板中的變量會(huì )隱藏(而不是覆蓋)數據模型中同名變量,如果需要訪(fǎng)問(wèn)數據模型中的同名變量,使用特殊變量global,下面的例子假設數據模型中的user的值是Big Joe:
<#assign user = "Joe Hider">
${user} <#-- prints: Joe Hider -->
${.globals.user} <#-- prints: Big Joe -->

(3)名字空間

通常情況,只使用一個(gè)名字空間,稱(chēng)為主名字空間

為了創(chuàng )建可重用的宏、變換器或其它變量的集合(通常稱(chēng)庫),必須使用多名字空間,其目的是防止同名沖突

  • 創(chuàng )建庫

下面是一個(gè)創(chuàng )建庫的例子(假設保存在lib/my_test.ftl中):

<#macro copyright date>
<p>Copyright (C) ${date} Julia Smith. All rights reserved.
<br>Email: ${mail}</p>
</#macro>
<#assign mail = "jsmith@acme.com">
使用import指令導入庫到模板中,Freemarker會(huì )為導入的庫創(chuàng )建新的名字空間,并可以通過(guò)import指令中指定的散列變量訪(fǎng)問(wèn)庫中的變量:
<#import "/lib/my_test.ftl" as my>
<#assign mail="fred@acme.com">
<@my.copyright date="1999-2002"/>
${my.mail}
${mail}
輸出結果:
  <p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.
<br>Email: jsmith@acme.com</p>
jsmith@acme.com
fred@acme.com
可以看到例子中使用的兩個(gè)同名變量并沒(méi)有沖突,因為它們位于不同的名字空間

可以使用assign指令在導入的名字空間中創(chuàng )建或替代變量,下面是一個(gè)例子:

<#import "/lib/my_test.ftl" as my>
${my.mail}
<#assign mail="jsmith@other.com" in my>
${my.mail}
輸出結果:
jsmith@acme.com
jsmith@other.com
數據模型中的變量任何地方都可見(jiàn),也包括不同的名字空間,下面是修改的庫:
<#macro copyright date>
<p>Copyright (C) ${date} ${user}. All rights reserved.</p>
</#macro>
<#assign mail = "${user}@acme.com">
假設數據模型中的user變量的值是Fred,則下面的代碼:
<#import "/lib/my_test.ftl" as my>
<@my.copyright date="1999-2002"/>
${my.mail}
輸出結果:
  <p>Copyright (C) 1999-2002 Fred. All rights reserved.</p>
Fred@acme.com


補充(靜態(tài)方法的調用):


方法1:
##定義配置文件 freemarkerstatic.properties
_Validator=com.longyou.util.Validator
_Functions=com.longyou.util.Functions
_EscapeUtils=com.longyou.util.EscapeUtils
/調用代碼
${_Functions.toUpperCase("Hello")}<br>
${_EscapeUtils.escape("狼的原野")}

方法2:
${stack.findValue("@package.ClassName@method")}


補充:常用語(yǔ)法

EG.一個(gè)對象BOOK

1.輸出 ${book.name}

空值判斷:${book.name?if_exists },

${book.name?default(‘xxx’)}//默認值xxx

${ book.name!"xxx"}//默認值xxx

日期格式:${book.date?string(‘yyyy-MM-dd‘)}

數字格式:${book?string.number}--20

${book?string.currency}--<#-- $20.00 -->

${book?string.percent}—<#-- 20% -->

插入布爾值:

<#assign foo=ture />

${foo?string("yes","no")} <#-- yes -->

2.邏輯判斷

a:

<#if condition>...

<#elseif condition2>...

<#elseif condition3>......

<#else>...

其中空值判斷可以寫(xiě)成<#if book.name?? >

b:

<#switch value>

<#case refValue1>

...

<#break>

<#case refValue2>

...

<#break>

...

<#case refValueN>

...

<#break>

<#default>

...

3.循環(huán)讀取

<#list sequence as item>

...

空值判斷<#if bookList?size = 0>

e.g.

<#list employees as e>

${e_index}. ${e.name}

輸出:

1. Readonly

2. Robbin


freemarker的Eclipse插件
  • If you use Eclipse 2.x:
    1. Open the Window menu, then Open Perspective -> Install/Update
    2. Click with the right mouse button on the Feature Updates view, then select New -> Site Bookmark
    3. In the displayed dialog box, type "FreeMarker" for Name and "http://www.freemarker.org/eclipse/update" for URL. Leave the "Bookmark type" radio buttons on "Eclipse update site".
    4. Click Finish
    5. Open the tree node under the newly created update site named "FreeMarker", select the "FreeMarker X.Y.Z" feature, and install it using the Install now button in the preview pane.
  • If you use Eclipse 3.x:
    1. Help -> Software updates -> Find and install....
    2. Choose "Search for new features to install".
    3. Click Add Update Site..., and type "FreeMarker" for Name and "http://www.freemarker.org/eclipse/update" for URL.
    4. Check the box of the "FreeMarker" feature.
    5. "Next"-s until it is installed...
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
freemarker(FTL)常見(jiàn)語(yǔ)法大全
五、案例
Freemarker 使用
FreeMarket模板引擎快速入門(mén)【面試+工作】
FreeMarker設計指南(4) (完)
【FreeMarker】【模板文件FTL】模板自定義指令 macro
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久