Freemarker 基礎語法使用 相關容易錯誤知識點 每個用法都寫了demo代碼 值得一看^_^

1:FreeMarker語言概述

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

模板編寫爲FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的編程語言。 那就意味着要準備數據在真實編程語言中來顯示,比如數據庫查詢和業務運算, 之後模板顯示已經準備好的數據。在模板中,你可以專注於如何展現數據, 而在模板之外可以專注於要展示什麼數據。

Figure

這種方式通常被稱爲 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博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章