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 tag)3、支持表達式語言(el)4、官方標準,用戶群廣,豐富的第三方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的性能比使用tag和el的jsp好。2、宏定義比jsp tag方便3、內置大量常用功能。比如html過濾,日期金額格式化等等,使用非常方便4、支持jsp標簽5、可以實現嚴格的mvc分離