1:FreeMarker語言概述
FreeMarker 是一款 模板引擎: 即一種基於模板和要改變的數據, 並用來生成輸出文本(HTML網頁,電子郵件,配置文件,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
模板編寫爲FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的編程語言。 那就意味着要準備數據在真實編程語言中來顯示,比如數據庫查詢和業務運算, 之後模板顯示已經準備好的數據。在模板中,你可以專注於如何展現數據, 而在模板之外可以專注於要展示什麼數據。
這種方式通常被稱爲 MVC (模型 視圖 控制器) 模式,對於動態網頁來說,是一種特別流行的模式。 它幫助從開發人員(Java 程序員)中分離出網頁設計師(HTML設計師)。設計師無需面對模板中的複雜邏輯, 在沒有程序員來修改或重新編譯代碼時,也可以修改頁面的樣式。
而FreeMarker最初的設計,是被用來在MVC模式的Web開發框架中生成HTML頁面的,它沒有被綁定到 Servlet或HTML或任意Web相關的東西上。它也可以用於非Web應用環境中。
2:FreeMarker特性
通用目標
能夠生成各種文本:HTML、XML、RTF、Java源代碼等等
易於嵌入到你的產品中:輕量級;不需要Servlet環境
插件式模板載入器:可以從任何源載入模板,如本地文件、數據庫等等
你可以按你所需生成文本:保存到本地文件;作爲Email發送;從Web應用程序發送它返回給Web瀏覽器
強大的模板語言
所有常用的指令:include、if/elseif/else、循環結構
在模板中創建和改變變量
幾乎在任何地方都可以使用複雜表達式來指定值
命名的宏,可以具有位置參數和嵌套內容
名字空間有助於建立和維護可重用的宏庫,或者將一個大工程分成模塊,而不必擔心名字衝突
輸出轉換塊:在嵌套模板片段生成輸出時,轉換HTML轉義、壓縮、語法高亮等等;你可以定義自己的轉換
通用數據模型
FreeMarker不是直接反射到Java對象,Java對象通過插件式對象封裝,以變量方式在模板中顯示
你可以使用抽象(接口)方式表示對象(JavaBean、XML文檔、SQL查詢結果集等等),告訴模板開發者使用方法,使其不受技術細節的打擾
3:基本指令用法和錯誤的點
3.1 處理不存在的變量&對象 用??來判斷
一個不存在的變量和一個是 null
值的變量, 對於FreeMarker來說是一樣的,所以這裏所指的"丟失"包含這兩種情況。
//錯誤的寫法
<#if test> //如果在一個變量或者對象的時候 不加上判斷爲null的情況就會報錯
</#if>
//正確的寫法
<#if test ??> //變量名後面通過放置 ?? 來詢問一個變量是否存在。將它和 if 指令合併, 那麼如果 user 變量不存在的話將會忽略整個問候的代碼
</#if>
3.2 對象存在,對象中的變量值爲null需要加 ?if_exists
//錯誤的寫法
<#list test as item> //item 是可以自定義的
<li>${test.name}<li>
</#list>
//正確的寫法
1:test首先需要判斷是否爲null
2: 要加上?if_exists ?if_exists如果存在 返回該變量值,否者不輸出
3: test.name也要加上?if_exists判斷
<#if test ??>
<#list test?if_exists as item> //item 是可以自定義的
<li>${test.name?if_exists}<li>
</#list>
</#if>
3.3 if 指令與比較運算符一起搭配 相關使用
表達式中支持的比較運算符有如下幾種:
1. =(或者==):判斷兩個值是否相等;
2. !=:判斷兩個值是否不相等;
注: =和!=可以用作字符串、數值和日期的比較,但兩邊的數據類型必須相同。而且FreeMarker的比較是精確比較,不會忽略大小寫及空格。
3. >(或者gt):大於
4. >=(或者gte):大於等於
5. <(或者lt):小於
6. <=(或者lte):小於等於
注: 上面這些比較運算符可以用於數字和日期,但不能用於字符串。大部分時候,使用gt比>有更好的效果,因爲FreeMarker會把>解釋成標籤的結束字符。可以使用括號來避免這種情況。
1:判斷2個值是否相等
<#if id == 0> //也可以寫成 <#if id = 0>或者<#if id == "0">
</#if>
2:判斷2個值不想等
<#if id != 0> //也可以寫成 <#if id != 0>或者<#if id != "0">
</#if>
3:判斷當前數字大於
<#if id > 0> //也可以寫成 <#if id gt 0>
</#if>
4:判斷當前數字大於等於
<#if id >= 0> //也可以寫成 <#if id gte 0>
</#if>
5:判斷當前數字小於
<#if id < 0> //也可以寫成 <#if id lt 0>
</#if>
6:判斷當前數字小於等於
<#if id <= 0> //也可以寫成 <#if id lte 0>
</#if>
3.4 list 標籤相關使用
3.4.1 list 就是一個遍歷輸出數組的標籤
//這裏的test數組 只有3條數據記錄
<#if test ??>
<#list test?if_exists as item> //item自定義 隨便寫
<li>${item.name}</li>
</#list>
</#if>
//頁面輸出結果的話就是
<li>小蘭</li>
<li>小王</li>
<li>小譚</li>
3.4.2 list (長度,遍歷,下標,嵌套,排序,)
默認設置當前數組爲3
1:list遍歷數組輸出
<#if test ??>
<#list test ?if_exists as item>
<li>${item.name}</li> //name是你的變量名稱
</#list>
</#if>
2:list獲取每條數據的下標 _index爲每條數據的下標 下標也是從0開始
<#if test ??>
<#list test ?if_exists as item>
<li>${item_index}</li>
</#list>
</#if>
//頁面輸出就是
<li>0</li>
<li>1</li>
<li>2</li>
3:list對數組排序 升序&降序
3.1 升序
<#list test?sort_by("字段") as item>
</#list>
3.2降序
<#list test?sort_by("字段")?reverse as item>
</#list>
4:list長度的判斷
<#if test??>
<#list test?if_exists as item>
<#if (test?size == 6) > 6</#if>
<#if (test?size == 8) > 8</#if>
</#list>
</#if>
3.5 split 字符串切割
<#if test ??>
<#list test?split(",") as item> //切割的字符是可以自己根據數據來指定的哈
<td>年齡:${item}</td>
</#list>
</#if>
3.6 list標籤遍歷map數據
<#if map2?exists>
<#list map2?keys as key>
key:${key}
</#list>
</#if>
3.7基本數據類型 補充一下
1. 布爾型:等價於java中的boolean類型, 不同的是不能直接輸出,可以轉換成字符串再輸出
2. 日期型:等價於java中的Date類型, 不同之處在於不能直接輸出,需要轉換成字符串再輸出
3. 數值型:等價於java 中的int, float, double 等數值類型,有三種顯示形式:數值型(默認) 、貨幣型、百分比型
4. 字符串型:等價於java 中的字符串,有很多內置函數
5. sequence 類型:等價於java中的數組,list,set 等集合類型
6. hash 類型:等價於java 中的Map 類型
後續還會更新文章介紹相關的寫法和注意點 謝謝閱讀當前文章 期待你的評論文章不足之處。 我的博客網站:TAN博客