天天看點

Freemarker中周遊List以及内置函數使用

在freemarker應用中經常會周遊list擷取需要的資料,并對需要的資料進行排序加工後呈現給使用者。

那麼在freemarker中如何周遊list,并對list中資料進行适當的排序呢?

一、 freemarker中list指令簡單介紹

要想在freemarker中周遊list,必須通過使用list指令,即<#list sequence as item>…</#list>

sequence是集合(collection)的表達式,item是循環變量的名字,不能是表達式。

當在周遊sequence時,會将周遊變量的值儲存到item中。

舉個例子說明吧:

<#list userlist as user>

</#list>

userlist中封裝了很多個user對象,我們在周遊userlist時候,會将周遊的user對象的值,儲存到上述的user變量中。那麼在取值時,我們可以通過${user.username }來擷取user對象的username屬性值。

list指令還隐含了兩個循環變量:

item_index:目前疊代項在所有疊代項中的位置,是數字值。

item_has_next:用于判斷目前疊代項是否是所有疊代項中的最後一項。

注意:在使用上述兩個循環變量時,一定要将item換成你自己定義的循環變量名,item其實就是字首罷了。

例如,如果你使用<# list list as l>..</#list>定義,那麼就要使用l_index,l_has_next。

在循環過程中,如果您想跳出循環,那麼可以使用結合break指令,即<#break>來完成。

二、 freemarker中對list進行排序

通常我們的排序操作都是通過dao層來實作的,如果我們想随時更改我們的排序,那麼就必須修改我們的dao層代碼,确實不友善。但freemarker為我們提供了這樣的排序方法,解決了這個問題。

1. sort升序排序函數

sort對序列(sequence)進行排序,要求序列中的變量必須是:字元串(按首字母排序),數字,日期值。

<#list list?sort as l>…</#list>

2. sort_by函數

sort_by有一個參數,該參數用于指定想要排序的子變量,排序是按照變量對應的值進行排序,如:

<#list userlist?sort_by(“age”) as user>…</#list>

age是user對象的屬性,排序是按age的值進行的。

3. reverse降序排序函數

<#list list? reverse as l>…</#list>

reverse使用同sort相同。reverse還可以同sort_by一起使用

如:想讓使用者按年齡降序排序,那麼可以這樣寫:

<#list userlist?sort_by(“age”)?reverse as user>…</#list>

freemrker内置了很多函數,如操作字元串,數字,集合等,可以友善的在頁面處理資料。

一、 sequence的内置函數

1. sequence?first 傳回sequence的第一個值。

2. sequence?last 傳回sequence的最後一個值。

3. sequence?reverse 将sequence的現有順序反轉,即倒序排序

4. sequence?size 傳回sequence的大小

5. sequence?sort 将sequence中的對象轉化為字元串後順序排序

6. sequence?sort_by(value) 按sequence中對象的屬性value進行排序

注意:sequence不能為null。以上方法在我的另一篇部落格freemarker中如何周遊list有詳細的應用,感興趣的朋友可以參考。

二、 hash的内置函數

1. hash?keys 傳回hash裡的所有key,傳回結果為sequence

2. hash?values 傳回hash裡的所有value,傳回結果為sequence

例如:

<#assign user={“name”:“hailang”, “sex”:“man”}>

<#assign keys=user?keys>

<#list keys as key>

key=key={user[key]}

三、 操作字元串函數

1. substring(start,end)從一個字元串中截取子串

start:截取子串開始的索引,start必須大于等于0,小于等于end

end: 截取子串的長度,end必須大于等于0,小于等于字元串長度,如果省略該參數,預設為字元串長度。

例子:

${‘str’?substring(0)}à結果為str

${‘str’?substring(1)}à結果為tr

${‘str’?substring(2)}à結果為r

${‘str’?substring(3)}à結果為

${‘str’?substring(0,0)}à結果為

${‘str’?substring(0,1)}à結果為s

${‘str’?substring(0,2)}à結果為st

${‘str’?substring(0,3)}à結果為str

2. cap_first 将字元串中的第一個單詞的首字母變為大寫。

${‘str’?cap_first}à結果為str

3. uncap_first将字元串中的第一個單詞的首字母變為小寫。

4. capitalize将字元串中的所有單詞的首字母變為大寫

${‘str’? capitalize}à結果為str

5. date,time,datetime将字元串轉換為日期

<#assign date1=”2009-10-12”?date(“yyyy-mm-dd”)>

<#assign date2=”9:28:20”?time(“hh:mm:ss”)>

<#assign date3=” 2009-10-12 9:28:20”?time(“hh:mm:ss”)>

${date1}à結果為2009-10-12

${date2}à結果為9:28:20

${date3}à結果為2009-10-12 9:28:20

時間格式化: ${book.date?string('yyyy-mm-dd')}

判斷長度:<#if oa.content?length gt= 20>

注意:如果指定的字元串格式不正确将引發錯誤。

6. ends_with 判斷某個字元串是否由某個子串結尾,傳回布爾值。

${“string”?ends_with(“ing”)?string} 傳回結果為true

注意:布爾值必須轉換為字元串才能輸出

7. html 用于将字元串中的<、>、&和“替換為對應得<>&quot:&amp

8. index_of(substring,start)在字元串中查找某個子串,傳回找到子串的第一個字元的索引,如果沒有找到子串,則傳回-1。

start參數用于指定從字元串的那個索引處開始搜尋,start為數字值。

如果start大于字元串長度,則start取值等于字元串長度,如果start小于0, 則start取值為0。

${“string”?index_of(“in”) à結果為3

${“string”?index_of(“ab”) à結果為-1

9. length傳回字元串的長度 ${“string”?length}à結果為6

10. lower_case将字元串轉為小寫

${“string”?lower_case}à結果為string

11. upper_case将字元串轉為大寫

${“string”?upper_case}à結果為string

12. contains 判斷字元中是否包含某個子串。傳回布爾值

${“string”?contains(“ing”)?string} à結果為true

13. number将字元串轉換為數字

${“111.11”?number}à結果為111.11

14. replace用于将字元串中的一部分從左到右替換為另外的字元串。

${“strabg”?replace(“ab”,”in”)} à結果為string

15. split使用指定的分隔符将一個字元串拆分為一組字元串

<#list “this|is|split”?split(“|”) as s>

${s}

結果為:

this

is

split

16. trim 删除字元串首尾空格 ${“ string ”?trim} à結果為string

四、 操作數字

1. c 用于将數字轉換為字元串

${123?c} à結果為123

2. string用于将數字轉換為字元串

freemarker中預訂義了三種數字格式:number,currency(貨币)和percent(百分比)其中number為預設的數字格式轉換

<#assign tempnum=20>

${tempnum}

tempnum?string.number或tempnum?string.number或{tempnum?string(“number”)} à結果為20

tempnum?string.currency或tempnum?string.currency或{tempnum?string(“currency”)} à結果為¥20.00

tempnum?string.percent或tempnum?string.percent或{tempnum?string(“percent”)} à結果為2,000%

五、 操作布爾值

string 用于将布爾值轉換為字元串輸出

true轉為“true”,false轉換為“false”

foo?string(“yes”,”no”)如果布爾值是true,那麼傳回“yes”,否則傳回no

freemarker的插值有如下兩種類型:1,通用插值${expr};2,數字格式化插值:#{expr}或#{expr;format}

1、通用插值

對于freemarker的通用插值,又可以分為以下4種情況:

1. freemarker插值結果為字元串值:直接輸出表達式結果

2. freemarker插值結果為數字值:根據預設格式(由#setting指令設定)将表達式結果轉換成文本輸出.可以使用内建的字元串函數格式化單個插值,如下面的例子:

<#settion number_format="currency"/>

<#assign answer=42/>

answeranswer{answer?string} <#-- the same as answer−−>answer−−>{answer?string.number}

answer?string.currencyanswer?string.currency{answer?string.percent}

answer輸出結果是:answer輸出結果是:42.00

42.004242.004242.00

4,200%

3. freemarker插值結果為日期值:根據預設格式(由#setting指令設定)将表達式結果轉換成文本輸出.可以使用内建的字元串函數格式化單個插值,如下面的例子:

lastupdated?string("yyyy−mm−ddhh:mm:sszzzz")lastupdated?string("yyyy−mm−ddhh:mm:sszzzz"){lastupdated?string("eee, mmm d, ''yy")}

{lastupdated?string("eeee, mmmm dd, yyyy, hh:mm:ss a '('zzz')'")} 輸出結果是: 2008-04-08 08:08:08 pacific daylight time tue, apr 8, '03 tuesday, april 08, 2003, 08:08:08 pm (pdt) 4. freemarker插值結果為布爾值:根據預設格式(由#setting指令設定)将表達式結果轉換成文本輸出.可以使用内建的字元串函數格式化單個插值,如下面的例子: <#assign foo=true/>{lastupdated?string("eeee, mmmm dd, yyyy, hh:mm:ss a '('zzz')'")} 輸出結果是: 2008-04-08 08:08:08 pacific daylight time tue, apr 8, '03 tuesday, april 08, 2003, 08:08:08 pm (pdt) 4. freemarker插值結果為布爾值:根據預設格式(由#setting指令設定)将表達式結果轉換成文本輸出.可以使用内建的字元串函數格式化單個插值,如下面的例子: <#assign foo=true/>{foo?string("yes", "no")}

輸出結果是:

yes

2、數字格式化插值

關于freemarker數字格式化插值可采用#{expr;format}形式來格式化數字,其中format可以是:

mx:小數部分最小x位

mx:小數部分最大x位

如下面的例子:

<#assign x=2.582/>

<#assign y=4/>

#{x; m2} <#-- 輸出2.58 -->

#{y; m2} <#-- 輸出4 -->

#{x; m2} <#-- 輸出2.6 -->

#{y; m2} <#-- 輸出4.0 -->

#{x; m1m2} <#-- 輸出2.58 -->

繼續閱讀