FreeMarker設計指南(3)

okone96發表於2007-03-16

3、模板

(1)整體結構

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

Ø 文字:直接輸出

Ø Interpolation:由${和},或#{和}來限定,計算值替代輸出

Ø FTL標記:FreeMarker指令,和HTML標記類似,名字前加#予以區分,不會輸出

Ø 註釋:由

下面是以一個具體模板例子:

Welcome! Welcome ${user}!

We have these animals:

  • ${being.name} for ${being.price} Euros #list>
[BR]是用於換行的特殊字元序列

注意事項:

Ø FTL區分大小寫,所以list是正確的FTL指令,而List不是;${name}和${NAME}是不同的

Ø Interpolation只能在文字中使用

Ø FTL標記不能位於另一個FTL標記內部,例如:

='bar'>...Ø 註釋可以位於FTL標記和Interpolation內部,如下面的例子:

Welcome ${user [BR]

We have these animals:[BR]

    [BR][BR]... Ø 多餘的空白字元會在模板輸出時移除

    (2)指令

    在FreeMarker中,使用FTL標記引用指令

    有三種FTL標記,這和HTML標記是類似的:

    Ø 開始標記:

    Ø 結束標記:#directivename>

    Ø 空內容指令標記:

    有兩種型別的指令:預定義指令和使用者定義指令

    使用者定義指令要使用@替換#,如...<>(會在後面講述)

    FTL標記不能夠交叉,而應該正確的巢狀,如下面的程式碼是錯誤的:

    • ${being.name} for ${being.price} Euros (except for you)#list>#if> 如果使用不存在的指令,FreeMarker不會使用模板輸出,而是產生一個錯誤訊息

      FreeMarker會忽略FTL標記中的空白字元,如下面的例子:

      [BR]${being.name} for ${being.price} Euros[BR]#list > 但是,

      (3)表示式

      直接指定值

      Ø 字串

      n 使用單引號或雙引號限定

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

      ${"It's "quoted" andthis is a backslash: "} ${'It's "quoted" andthis is a backslash: } 輸出結果是:

      It's "quoted" andthis is a backslash: It's "quoted" andthis 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進位制Unicode程式碼

      有一類特殊的字串稱為raw字串,被認為是純文字,其中的和{等不具有特殊含義,該類字串在引號前面加r,下面是一個例子:

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

      ${foo}C:foobar Ø 數字

      n 直接輸入,不需要引號

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

      n 目前版本不支援科學計數法,所以“1E3”是錯誤的

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

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

      Ø 布林值

      n true和false,不使用引號

      Ø 序列

      n 由逗號分隔的子變數列表,由方括號限定,下面是一個例子:

      ${x}#list> 輸出的結果是:

      winterspringsummerautumnn 列表的專案是表示式,所以可以有下面的例子:

      [2 + 2, [1, 2, 3, 4], "whatnot"]n 可以使用數字範圍定義數字序列,例如2..5等同於[2, 3, 4, 5],但是更有效率,注意數字範圍沒有方括號

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

      Ø 雜湊(hash)

      n 由逗號分隔的鍵/值列表,由大括號限定,鍵和值之間用冒號分隔,下面是一個例子:

      {"name":"green mouse", "price":150}n 鍵和值都是表示式,但是鍵必須是字串

      l 獲取變數

      Ø 頂層變數: ${variable},變數名只能是字母、數字、下劃線、$、@和#的組合,且不能以數字開頭

      Ø 從雜湊中獲取資料

      n 可以使用點語法或方括號語法,假設有下面的資料模型:

      (root) | +- book | | | +- title = "Breeding green mouses" | | | +- author | | | +- name = "Julia Smith" | | | +- info = "Biologist, 1923-1985, Canada" | +- test = "title" 下面都是等價的:

      book.author.namebook["author"].namebook.author.["name"]book["author"]["name"]n 使用點語法,變數名字有頂層變數一樣的限制,但方括號語法沒有該限制,因為名字是任意表示式的結果

      Ø 從序列獲得資料:和雜湊的方括號語法語法一樣,只是方括號中的表示式值必須是數字;注意:第一個專案的索引是0

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

      Ø 特殊變數:FreeMarker內定義變數,使用.variablename語法訪問

      字串操作

      Ø Interpolation(或連線操作)

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

      ${"Hello ${user}!"}${"${user}${user}${user}${user}"} n 可以使用+運算子獲得同樣的結果

      ${"Hello " + user + "!"}${user + user + user + user}n ${..}只能用於文字部分,下面的程式碼是錯誤的:

      Wow!#if>Wow!#if>應該寫成:

      Wow!#if>Ø 子串

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

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

      BJig J 序列操作

      Ø 連線操作:和字串一樣,使用+,下面是一個例子:

      - ${user}#list>輸出結果是:

      - Joe- Fred- Julia- Kate 雜湊操作

      Ø 連線操作:和字串一樣,使用+,如果具有相同的key,右邊的值替代左邊的值,例如:

      - Joe is ${ages.Joe}- Fred is ${ages.Fred}- Julia is ${ages.Julia} 輸出結果是:

      - Joe is 30- Fred is 25- Julia is 18 算術運算

      Ø +、-、×、/、%,下面是一個例子:

      ${x * x - 100}${x / 2}${12 % 10}輸出結果是(假設x為5):

      -752.52 Ø 運算子兩邊必須是數字,因此下面的程式碼是錯誤的:

      ${3 * "5"}

      ${3 + "5"} 輸出結果是:

      35Ø 使用內建的int(後面講述)獲得整數部分,例如:

      ${(x/2)?int}${1.1?int}${1.999?int}${-1.1?int}${-1.999?int}輸出結果是(假設x為5):

      211-1-1 比較運算子

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

      Ø =和!=兩邊必須是相同型別的值,否則會產生錯誤,例如會引起錯誤

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

      Ø 對數字和日期可以使用和>=,但不能用於字串

      Ø 由於Freemarker會將>解釋成FTL標記的結束字元,所以對於>和>=可以使用括號來避免這種情況,例如 y)>

      Ø 另一種替代的方法是,使用lt、lte、gt和gte來替代和>=

      邏輯運算子

      Ø &&(and)、||(or)、!(not),只能用於布林值,否則會產生錯誤

      Ø 例子:

      We have less than 12 things, and they are green.#if> 內建函式

      Ø 內建函式的用法類似訪問雜湊的子變數,只是使用“?”替代“.”,下面列出常用的一些函式

      Ø 字串使用的:

      n html:對字串進行HTML編碼

      n cap_first:使字串第一個字母大寫

      n lower_case:將字串轉換成小寫

      n upper_case:將字串轉換成大寫

      n trim:去掉字串前後的空白字元

      Ø 序列使用的:

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

      Ø 數字使用的:

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

      Ø 例子(假設test儲存字串"Tom & Jerry"):

      ${test?html}${test?upper_case?html}輸出結果是:

      Tom & JerryTOM & JERRY 運算子優先順序

      運算子組
      運算子

      字尾
      [subvarName] [subStringRange] . (methodParams)

      一元
      +expr、-expr、!

      內建
      ?

      乘法
      *、 / 、%

      加法
      +、-

      關係
      、<=、>=(lt、lte、gt、gte)

      相等
      ==(=)、!=

      邏輯and
      &&

      邏輯or
      ||

      數字範圍
      ..

      (4)Interpolation

      Interpolation有兩種型別:

      Ø 通用Interpolation:${expr}

      Ø 數字Interpolation:#{expr}或#{expr; format}

      注意:Interpolation只能用於文字部分

      通用Interpolation

      Ø 插入字串值:直接輸出表示式結果

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

      ${answer}${answer?string}

      $42.00$42.0042$42.004,200%Ø 插入日期值:根據預設格式(由#setting指令設定)將表示式結果轉換成文字輸出;可以使用內建函式string格式化單個Interpolation,下面是一個使用格式模式的例子:

      ${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')'")} 輸出的結果類似下面的格式:

      2003-04-08 21:24:44 Pacific Daylight TimeTue, Apr 8, '03Tuesday, April 08, 2003, 09:24:44 PM (PDT)Ø 插入布林值:根據預設格式(由#setting指令設定)將表示式結果轉換成文字輸出;可以使用內建函式string格式化單個Interpolation,下面是一個例子:

      ${foo?string("yes", "no")}輸出結果是:

      yes 數字Interpolation的#{expr; format}形式可以用來格式化數字,format可以是:

      Ø mX:小數部分最小X位

      Ø MX:小數部分最大X位

      Ø 例子:

      #{x; M2} [@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-905566/,如需轉載,請註明出處,否則將追究法律責任。

相關文章