FreeMarker

FreeMarker是一款模板引擎:即一種基于模板和要改變的數據,并用來生成輸出文本(HTML網頁、電子郵件配置文件源代碼等)的通用工具。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件


freemarker模板文件(*.ftl)的基本組成部分

1.?文本:直接輸出的內容部分

2.?注釋:不會輸出的內容,格式為<#--?注釋內容-->

3.?取值(插值):代替輸出數據模型的部分,格式為${數據模型}或#{數據模型}

?? ??? ?4. ftl指令:Freemarker指令,類似于HTML標記。

?? ??? ?????????????????????內建指令:開始標簽:<#directivename parameter>?結束標簽:?????空標簽:<#directivename parameter/>

?自定義指令:開始標簽:<@directivename parameter>?結束標簽:?????空標簽:<@directivename parameter/>

Freemarker語法及使用方法

1.?取值(插值)指令及適用類型:

(1) ${var}

?適用類型:java中常用的八大基本類型以及我們的String引用類型,但是,freemarker中boolean類型顯示時true==yes? false==no

?? ??? ??? ??? ??? ??? ?示例:

?在后臺文件中定義變量

?? ??? ??? ??? ??? ??? ??? ??? ???????? String strVar = "世界你好";

int intVar = 10;

boolean booVar = true;

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中獲取變量:

?? ??? ??? ??? ??? ??? ??? ??? ???????? String獲取: ${strVar}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?int獲取: ${intVar}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?boolean獲取: ${booVar?string("yes","no")}

?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?? ??? ??? ??? ??? ??? ??? ??? ???????? String獲取:世界你好

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?int獲取:10

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?boolean獲取:yes

(2)${var!}

?適用類型:對null?或者不存在的對象進行取值,可以設置默認值,例:${var!'我是默認值'}?即,有值時顯示正常值,無值時顯示默認值

?? ??? ??? ??? ??? ??? ?示例:

?在后臺文件中定義變量

?? ??? ??? ??? ??? ??? ??? ??? ???????? String strVar = "世界你好";

String str = null;

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中獲取變量:

?? ??? ??? ??? ??? ??? ??? ??? ???????? String獲取: ${strVar!"我是空"}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?str獲取: ${str!}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?str獲取: ${str!"默認"}

?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?? ??? ??? ??? ??? ??? ??? ??? ???????? String獲取:世界你好

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?str獲取:

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?str獲取:默認

?? ??? ??? ??? ?(3)${封裝對象.屬性}

?適用類型:對封裝對象進行取值,例:${User.name}

?? ??? ??? ??? ??? ??? ?示例:

?在后臺文件中封裝對象User[ name,? age ]

?? ??? ??? ??? ??? ??? ??? ??? ???????? String name = "姓名";

int age = 18;

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中獲取變量:

?? ??? ??? ??? ??? ??? ??? ??? ???????? name獲取: ${User.name}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?age獲取: ${User.age}

?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?? ??? ??? ??? ??? ??? ??? ??? ???????? name獲取:姓名

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?age獲取:18

(4)${date?String('yyyy-MM-dd')}

?適用類型:對日期格式進行取值,在這里我要強調的是,定義Date類型的變量時,java.util.Date無法輸出日期,須使用java.sql.Date

?? ??? ??? ??? ??? ??? ?示例:

?在后臺文件中定義變量

java.sql.Date date = new Date().getTime();

java.sql.Date time = new Date().getTime();

java.sql.Date datetime = new Date().getTime();

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中獲取變量:

?? ??? ??? ??? ??? ??? ??? ??? ???????? date獲取: ${date?string('yyyy-MM-dd')}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?time獲取: ${date?string('HH:mm:ss')}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?datetime獲取: ${date?string('yyyy-MM-dd HH:mm:ss')}

?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?? ??? ??? ??? ??? ??? ??? ??? ???????? name獲取:姓名

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?age獲取:18

(5)${var?html}

?適用類型:轉義HTML內容

?? ??? ??? ??? ??? ??? ?示例:

?在后臺文件中封裝變量Menu[ name, model ]

Menu m = new Menu();

m.setName(" freemarker ");

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?m.setModel("我只是個菜單");

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中獲取變量:

?非轉義獲取: ${m.model}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?轉義獲取:${m.model?html}

?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?非轉義獲取:我只是個菜單

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?轉義獲取:我只是個菜單

(6)<#assign num = 100 />

?適用類型:定義變量,支持計算和賦值

?? ??? ??? ??? ??? ??? ?示例:

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中定義變量:

<#assign num = 100 />

?? ??? ??? ??? ??? ??? ??? ??? ???????? num獲取: ${num)}

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?計算結果: ${num * 10}

?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?? ??? ??? ??? ??? ??? ??? ??? ???????? num獲取:100

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?計算結果:1000

?? ??? ??? ??? ?(7)對List集合進行取值

?? ??? ??? ??? ???????? <#list? list集合as? item>

?????????????????????????????? ${item}??? --取值


?? ??? ??? ??? ??? ??? ?示例:

?在后臺文件中定義變量

List strList = new ArrayList();

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?strList.add("第一個值");

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?strList.add("第二個值");

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?strList.add("第三個值");

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中獲取變量:

<#list? strList? as? item>

?????????????????????????????????????????????? ${item!}
??? --取值


?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?第一個值

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?第二個值

???????????????????????????????????????第三個值

?? ??? ??? ??? ?(8)對Map集合進行取值

<#list map?keys as key>

${key}:${map[key]}


?? ??? ??? ??? ??? ??? ?示例:

?在后臺文件中定義變量

Map m = new HashMap();

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?m.put("name","姓名");

m.put("age",18);

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?m.put("sex","男");

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中獲取變量:

<#list m?keys as key>

${key}:${m[key]}


?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?? ??? ??? ??? ??? ??? ??? ??? ???????? name:姓名

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?age:18

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?sex:男

2.?條件判斷指令:

(1) if

?格式:<#if?條件>

?? ??? ??? ????????????????????????????輸出


?? ??? ??? ??? ??? ??? ?示例:

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中定義變量并判斷條件:

<#assign age = 18 />

<#if age == 18>

age = 18


?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

age = 18

(2) if - else

?格式:<#if?條件>

???????????????????????????????????????輸出

<#else>

?? ??? ??? ??? ??? ??? ????????????????輸出


?? ??? ??? ??? ??? ??? ?示例:

?在頁面中定義變量并判斷條件:

<#assign age = 20 />

<#if age == 18>

age = 18

<#else>

age != 18


?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

age != 18

(3) if - elseif - else

?格式:<#if?條件1>

???????????????????????????????????????輸出

<#elseif?條件2>

?? ??? ??? ??? ??? ??? ????????????????輸出

<#else>

?? ??? ??? ????????????????????????????輸出


?? ??? ??? ??? ??? ??? ?示例:

?在頁面中定義變量并判斷條件:

<#assign age = 20 />

<#if age > 18>

?? ??? ??? ???????????????????????????????????? 青年

<#elseif age == 18>

?成年

<#else>

?少年


?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?成年

?? ??? ??? ??? ?(4) switch? --常與case break default一起使用?參數可為字符串

?格式:<#switch var>

<#case?條件1>

?? ??? ??? ??????????????????????????????輸出

<#break>

<#case?條件2>

?? ??? ??? ??????????????????????????????輸出

<#break>

<#default>

?? ??? ??? ??????????????????????????????輸出


?? ??? ??? ??? ??? ??? ?示例:

?? ??? ??? ??? ??? ??? ??? ??? ?在頁面中定義變量并判斷:

?? ??? ??? ??? ??? ??? ??? ??? ??????? <#switch var="星期一">

?? ??????????????????????????????????? <#case "星期一">

?? ??? ??? ???????????????????????????????????油燜大蝦

<#break>

?? ??? ??? ??????????????????????????? <#case "星期二">

?? ??? ??? ???????????????????????????????????炸醬面

<#break>

<#default>

?? ??? ??? ???????????????????????????????????肯德基


?? ??? ??? ??? ??? ??? ??? ??? ?展示結果:

?油燜大蝦

3.?自定義函數、自定義指令:

(1)?自定義函數

?實現TemplateMthodModelEx

(2)?自定義指令

?實現TemplateDirectiveModel

?? ??? ??? ??? ??? ??? ?示例:

?? ??? ??? ??? ??? ??? ???????? <@自定義指令名稱入參(key-value格式) ;?出參(list格式)>

?運行條件



?? ??? ??? ??? ??? ??? ??? ??? ?PS:不同的返回值用逗號( , )間隔開


?? ??? ?4.常用內建函數、macro(宏指令)、function(函數指令):

(1)?常用內建函數

?處理字符串:

?? ??? ??? ??? ??? ??? ??? ? substring?????????????????????????????????????????截取字符串,包頭不包尾(下標)

?? ??? ??? ??? ??? ??? ??? ? cap_first?????????????????????????????????????????第一個字母大寫

?? ??? ??? ??? ??? ??? ??? ? end_with??????????????????????????????????????????以什么字母結尾

?? ??? ??? ??? ??? ??? ??? ? contains???????????????????????????????????????????是否包含目標字符串

?? ??? ??? ??? ??? ??? ??? ? date? datetime? time??????????????????????轉換成日期格式

?? ??? ??? ??? ??? ??? ??? ? starts_with?????????????????????????????????????以什么字母開頭

?? ??? ??? ??? ??? ??? ??? ? index_of?????????????????????????????????????????返回某個指定的字符串值在字符串中首次出現的位置(下標)

?? ??? ??? ??? ??? ??? ??? ? last_index_of?????????????????????????????????獲取指定字符出現的最后位置(下標)

?? ??? ??? ??? ??? ??? ??? ? split?????????????????????????????????????????????????分隔

?? ??? ??? ??? ??? ??? ??? ? trim?????????????????????????????????????????????????去兩端空格

?處理數字:

string

?? ??? ??? ??? ??? ??? ??? ? x?string("0.##")?????????????????????????變成小數點后幾位

?? ??? ??? ??? ??? ??? ??? ? round?????????????????????????????????????????????四舍五入

?? ??? ??? ??? ??? ??? ??? ? floor??????????????????????????????????????????????去掉小數點

?? ??? ??? ??? ??? ??? ??? ? ceiling????????????????????????????????????????????近1?變成整數

?處理list:

?? ??? ??? ??? ??? ??? ??? ?? first:?????????????????????????????????????????????取List值第一個值

?? ??? ??? ??? ??? ??? ??? ?? last:???????????????????????????????????????????????取List值最后一個值

?? ??? ??? ??? ??? ??? ??? ?? seq_contains:???????????????????????????????是否包含指定字符

?? ??? ??? ??? ??? ??? ??? ?? seq_index_of:??????????????????????????????指定字符所在位置

?? ??? ??? ??? ??? ??? ??? ?? size:???????????????????????????????????????????????集合大小

??? ??? ??? ??? ??? ??? ??? ?? reverse:?????????????????????????????????????????集合倒序排列

?? ??? ??? ??? ??? ??? ??? ?? sort:???????????????????????????????????????????????對集合進行排序

?? ??? ??? ??? ??? ??? ??? ?? sort_by:????????????????????????????????????????根據某一個屬性排序

?? ??? ??? ??? ??? ??? ??? ?? chunk:???????????????????????????????????????????分塊處理

?其他:

?? ??? ??? ??? ??? ??? ??? ?? is_string:?????????????????????????????????????是否為字符類型

?? ??? ??? ??? ??? ??? ??? ?? is_number:???????????????????????????????????是否為整數類型

?? ??? ??? ??? ??? ??? ??? ?? is_method:??????????????????????????????????是否為方法

?? ??? ??? ??? ??? ??? ??? ?? ():?????????????????????????????????????????????????判斷整個變量

?? ??? ??? ??? ??? ??? ??? ?? has_content:???????????????????????????????判斷對象是否為空或不存在

?? ??? ??? ??? ??? ??? ??? ?? eval:??????????????????????????????????????????求值

?? ??? ??? ??? ?(2) macro(宏指令)

?調用:<@macro_name param />

?? ??? ??? ??? ??? ??? ?語法:<#macro?變量名?參數>

<#nested/>


?? ??? ??? ??? ?(3) function(函數指令)

?調用:${function_name(param)}

?? ??? ??? ??? ??? ??? ?語法:<#function?變量名?參數>

<#return>


配置解析器以及表單例子后端交互

need-to-insert-img

need-to-insert-img

freemarker ,jsp各自特點

jsp是大家最熟悉的技術優點:1、功能強大,可以寫java代碼2、支持jsp標簽(jsp tag3、支持表達式語言(el4、官方標準,用戶群廣,豐富的第三方jsp標簽庫5、性能良好。jsp編譯成class文件執行,有很好的性能表現缺點:jsp沒有明顯缺點,非要挑點骨頭那就是,由于可以編寫java代碼,如使用不當容易破壞mvc結構。freemarker優點:1、不能編寫java代碼,可以實現嚴格的mvc分離2、性能非常不錯3、對jsp標簽支持良好4、內置大量常用功能,使用非常方便5、宏定義(類似jsp標簽)非常方便6、使用表達式語言缺點:1、不是官方標準2、用戶群體和第三方標簽庫沒有jsp選擇freemarker的原因:1、性能。velocity應該是最好的,其次是jsp,普通的頁面freemarker性能最差(雖然只是幾毫秒到十幾毫秒的差距)。但是在復雜頁面上(包含大量判斷、日期金額格式化)的頁面上,freemarker的性能比使用tageljsp好。2、宏定義比jsp tag方便3、內置大量常用功能。比如html過濾,日期金額格式化等等,使用非常方便4、支持jsp標簽5、可以實現嚴格的mvc分離

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容

  • 壹. 第一次見你,是個陰天,有風,你走在我前面,瘦瘦小小的一只,扎著馬尾,可能是手太小而頭發太多,光潔的后頸窩處有...
    曉烏閱讀 472評論 0 1
  • 夜深書中尋如顏,月下清風同未眠。朦朧燈火無盡處,唯見青藤爬窗頭。
    山澗泛舟人閱讀 237評論 0 0
  • 明素清輝,無言辭去瓊林苑。 白衣娟倩,疑是瑤光散。 飛落閑庭,花滿荒涼院。欲復返。 西風未現。都付空空念。 ①瓊林...
    浣花閣主閱讀 415評論 0 3
  • ——時間管理100講之35 一,變被動為主動。 聽講,閱讀,視聽都是被動學...
    聽見花開3閱讀 713評論 0 0
  • 如果你所在的行業發展特別好,公司也還行,但是你的上司對下屬很不信任。你感覺自己就像個傻瓜,但一時半會又不能辭職,面...
    Hecyzy閱讀 484評論 0 0