![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
,先來一打小白兔;
用程序語言編寫的程序就是模板,模板也被成為FTL(代表FreeMarker模板語言)。
模板是由如下部分混合而成的:
FTL區分大小寫;
FTL標簽不可以在其他FTL標簽和插值中使用,下面這樣寫是錯的;
<#if <#include 'foo'>='bar'>...</#if>注釋可以放在FTL標簽和插值中間;3.2 指令
標簽分為兩種:
指令有兩種類型:預定義指令和用戶自定義指令。對于用戶自定義的指令使用@來代替#;3.3 表達式3.3.1 簡介
${exPRession}3.3.2 快速瀏覽(備忘單)
這里是給已經了解FreeMarker的人或有經驗的程序員的一個提醒:
![2014-09-05_102721[5] 2014-09-05_102721[5]](http://s1.VeVb.com/20150728/xu1tqonlgcu46.png)
![2014-09-05_102818[5] 2014-09-05_102818[5]](http://s1.VeVb.com/20150728/sqk3c2yq3xx46.png)
3.3.3 直接確定值3.3.3.1 字符串
轉義
${"It's /"quoted/" and this is a blackslash: //"}輸出:
It's "quoted" and this is a blackslash: /轉義序列表:
![2014-09-05_104052[4] 2014-09-05_104052[4]](http://s1.VeVb.com/20150728/szrg53ycfyv46.png)
在1-4位的16進制碼。下面這個示例中都是在字符串中放置版權符號“/xA9 1999-2001”,“/x0A9 1999-2001”,“/x00A9 1999-2001”;
一種特殊的字符串就是原生字符串。在原生字符串中,反斜杠和${沒有特殊的含義,它們被視為普通的字符。為了表明字符串是原生字符串,在開始的引號或單引號之前放置字母r;
${r"${foo}"}${r"C:/foo/bar"}將會打印:
${foo}C:/foo/bar實例 <ul> <li>轉義:${"It's /"quoted/" and this is a blackslash: //"}</li> <li>版權符號:${"/xA9 1999-2000"}</li> <li>原生字符串:${r"${foo}"}</li> </ul>輸出:
3.3.3.2 數字
科學記數法暫不支持使用(1E3就是錯誤的)。不能在小數點之前不寫0(.5也是錯誤的);3.3.3.3 布爾值
直接寫true或false就表示一個布爾值了;3.3.3.4 序列
指定一個文字的序列,使用逗號來分隔其中的每個子變量,然后把整個列表放到方括號中。
<#list ["winter", "spring", "summer", "autumn"] as x>${x}</#list>將會打印出:
winterspringsummerautumn列表中的項目是表達式,那么也可以這樣做:[2+2, [1,2,3,4], “whatnot”],其中第一個子變量是數字4,第二個子變量是一個序列,第三個子變量是字符串“whatnot”。
也可以用start..end定義存儲數字范圍的序列,這里start和end是處理數字值表達式,比如2..5和[2, 3, 4, 5]是相同的,但是使用前者會更有效率(內存占用少而且速度快)。可以看出前者也沒有使用方括號,這樣也可以用來定義遞減的數字范圍,比如5..2。(此外,還可以省略end,只需5..即可,到無窮大)。實例
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/3/list.ftl
<#assign season=["summer", "winter", "spring", "autumn"]> <p> <#list season as s> ${s}, </#list> </p> <p> <#list season[2..] as x> ${x}, </#list> </p>輸出:
summer, winter, spring, autumn, spring, autumn, 3.3.3.5 哈希表鍵和值成對出現并以冒號分隔。{“name”:“green mouse”,“price”:150};3.3.4 檢索變量3.3.4.1 頂層變量3.3.4.2 從哈希表中檢索數據
![2014-09-05_111603[4] 2014-09-05_111603[4]](http://s1.VeVb.com/20150728/eiubf43osuh47.png)
book.author.name來讀取到auther的name;
如果我們想指定同一個表達式的子變量,那么還有另外一種語法格式:book[“title”]。
下面這些示例它們含義都是相等的:book.author.name, book["author"].name, book.author.["name"], book["author"]["name"]。
當使用點式語法時,頂層變量名的命名也是相同的限制(命名時只能使用字母,數字,下劃線,$,@等),而使用方括號語法形式時就沒有這樣的限制,它可以是任意的表達式。(為了FreeMarker支持xml,如果變量名是*(星號)或者**,那么就應該使用方括號語法格式)。3.3.4.3 從序列中檢索數據
animals[0].name3.3.4.4 特殊變量
特殊變量是由FreeMarker引擎本身定義的,為了使用它們,可以按照如下語法形式來進行:.variable_name;3.3.5 字符串操作3.3.5.1 插值(或連接)3.3.5.2 獲取一個字符
user[0],假設user是”Big Joe“,那么
${user[0]}${user[4]}將會打印:
BJ可以使用切分序列的方式來獲取一定范圍內的字符,比如user[1..4]和{user[4..]},然而這種使用方法已經被廢棄了,作為它的替代,可以使用內建函數substring。實例
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/3/string.ftl
<ul> <li>讀取一個字符:${user[0]}</li> <li>讀取一定范圍的字符:${user[1..5]}</li> <li>這種操作已經廢棄了,現在使用內建函數substring,${user?substring(1, 5)}</li> </ul>輸出:
?讀取一個字符:B?讀取一定范圍的字符:ig Jo?這種操作已經廢棄了,現在使用內建函數substring,ig J3.3.6 序列操作3.3.6.1 連接序列的連接可以使用+號來進行:
<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>/- ${user}</#list>要注意不要在很多重復連接時使用序列連接操作,比如在循環中往序列上追加項目,通過這種方式進行的許多重復連接最終產生的序列讀取的速度會變慢;3.3.6.2 序列切分
使用[firstindex..lastindex]可以獲取序列中的一部分,這里的firstindex和lastindex表達式的結果是數字,如果seq存儲序列“a”,“b”,“c”,“d”,“f”,那么表達式seq[1..4]將會是含有“b”,“c”,“d”,“e”的序列。實例
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/3/list.ftl
<h3>序列的操作</h3> <ul> <li>+連接: <#list ["sumer", "winter"]+["spring", "autumn"] as x> ${x}. </#list> </li> <li>序列切分: <#list season[2..3] as x> ${x}, </#list> </li> </ul>3.3.7 哈希表操作3.3.7.1 連接可以使用+號連接哈希表
<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>3.3.8 算數運算求模(求余): %3.3.9 比較運算
測試兩個值相等使用=(或者==,二者是完全等同的)3.3.10 邏輯操作3.3.11 內建函數
內建函數以?形式提供變量的不同形式或者其他信息。
例如得到字符串的大寫形式:user?upper_case;
字符串使用的內建函數:
序列使用的內建函數:
數字使用的內建函數:
示例:
${test?html}${test?upper_case?html}輸出是:
Tom & JerryTOM & JERRY3.3.12 方法調用假設程序員定義了一個可供調用的方法repeat。第一個參數字符串類型,第二個參數是數值類型。
${repeat("What", 3)}打印出:
WhatWhatWhat3.3.13 處理不存在的值要注意這個操作是FreeMarker2.3.7版本以后才有的(用來代替內建函數default,exists和if_exists);3.3.13.1 默認值
unsafe_expr!default_expr或 unsafe_expr! 或 (unsafe_expr)!default_expr 或 (unsafe_expr)!
${mouse!"No mouse."}<#assign mouse="Jerry">${mouse!"No mouse."}將會輸出:
No mouse.Jerry默認值可以是任何類型的表達式,也可以不必是字符串。
hits!0;colors!["red", "green", "blue"]默認值表達式的復雜程序沒有嚴格限制,你可以這么來寫:
cargo.weight!(item.weight * itemCount+10)如果默認值被忽略了,那么結果將會是空串,空序列或空哈希表。
(${mouse!})<#assign mouse = "Jerry">(${mouse!})輸出為:
()(Jerry)在不是頂層變量時,默認的操作符可以有兩種方式:
product.color!"red"當color不存在時(返回“red”)將會被處理,但是如果連product都不存在時將不會處理,也就是說這種寫法product必須存在,否則模板就會報錯。
(product.color)!"red"這種寫法,如果product不存在或者product存在而color不存在,都能顯示默認值“red”而不會報錯。
默認值操作也可以作用于序列,比如:
<#assign seq = ['a', 'b']>${seq[0]!'-'}${seq[1]!'-'}${seq[2]!'-'}${seq[3]!'-'}輸出為:
ab/-/-3.3.13.2 檢測不存在的值unsafe_expr??或者(unsafe_expr)??
<#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 foundCreating mouse...Mouse found3.3.14 括號3.3.15 表達式中的空格FTL忽略表達式中的多余空格。3.3.16 操作符的優先級3.4 插值
項目新聞熱點
疑難解答