1. 程式人生 > >Freemarker語法以及簡單使用

Freemarker語法以及簡單使用

Freemarker簡單使用

  • 先建立一個簡單的Maven工程(這裡預設大家都會啦),然後引入依賴
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
</dependency>

  • resources下建立模板檔案test.ftl
    • 模板檔案中四種元素
      • 1、文字,直接輸出的部分
      • 2、註釋,即<#–…-->格式不會輸出
      • 3、插值(Interpolation):即${…}部分,將使用資料模型中的部分替代輸出
      • 4、FTL指令:FreeMarker指令,和HTML標記類似,名字前加#予以區分,不會輸出。
<html>
<head>
	<meta charset="utf-8">
	<title>Freemarker入門DEMO </title>
</head>
<body>

${name},
你好。${message}
</body>
</html>
  • 建立Test.java類,在main方法中寫上下列方法
        //1.建立配置類
		Configuration configuration=new Configuration(Configuration.getVersion());
		//2.設定模板所在的目錄 
		configuration.setDirectoryForTemplateLoading(new File("H:/freemarkerDemo/src/main/resources/"));
		//3.設定字符集
		configuration.setDefaultEncoding("utf-8");
		//4.載入模板
		Template template = configuration.getTemplate("test.ftl");
		//5.建立資料模型
		Map map=new HashMap();
		map.put("name", "小豬佩奇 ");
		map.put("message", "Freemark靜態化世界體驗!!");
		//6.建立Writer物件
		Writer out =new FileWriter(new File("H:\\test.html"));//這裡是輸出檔案地址
		//7.輸出
		template.process(map, out);
		//8.關閉Writer物件
		out.close();

總結如下

第一步:建立一個 Configuration 物件,直接 new 一個物件。構造方法的引數就是freemarker的版本號。

第二步:設定模板檔案所在的路徑。

第三步:設定模板檔案使用的字符集。一般就是 utf-8.

第四步:載入一個模板,建立一個模板物件。

第五步:建立一個模板使用的資料集,可以是 pojo 也可以是 map。一般是 Map。

第六步:建立一個 Writer 物件,一般建立一 FileWriter 物件,指定生成的檔名。

第七步:呼叫模板物件的 process 方法輸出檔案。

第八步:關閉流

執行後,在H盤根目錄即可看到生成的test.html ,開啟看到如下
在這裡插入圖片描述

FTL常見語法

  • assign指令:此指令用於在頁面上定義一個變數

定義簡單型別:

<#assign linkman="小豬佩奇">

聯絡人:${linkman}

輸出結果:
在這裡插入圖片描述

定義物件型別:

<#assign info={"mobile":"112233",'address':'深圳市南山區南頭檢查站','pepole':'波波安'} >
<br>電話:${info.mobile}  地址:${info.address}   聯絡人:${info.pepole}<br>

輸出結果:
在這裡插入圖片描述

  • include指令:此指令用於模板檔案的巢狀

建立模板檔案head.ftl

<h1>測試標題</h1>

修改test.ftl,在模板檔案中使用include指令引入剛才我們建立的模板

<#include "head.ftl">
  • if指令

在程式碼中對str變數賦值

map.put("success", true);

在模板檔案上新增

<#if success="true">

    ${name},你好。${message}

<#else >
    沒有通過哦

</#if>

輸出結果:
image

在freemarker的判斷中,可以使用= 也可以使用==

  • list指令

程式碼中對變數phoneList賦值

        List phoneList = new ArrayList();
        Map map1=new HashMap();
        map1.put("name", "華為 ");
        map1.put("price", 9999);
        Map map2=new HashMap();
        map2.put("name", "蘋果 ");
        map2.put("price", 13999);
        Map map3=new HashMap();
        map3.put("name", "三星 ");
        map3.put("price", 8888);

在模板檔案上新增


<br>----商品價格表----<br>
<#list phoneList as phones>
    ${phones_index+1} 商品名稱: ${phones.name} 價格:${phones.price}<br>
</#list>

輸出結果:
image

如果想在迴圈中得到索引,使用迴圈變數+_index就可以得到。

  • 內建函式

語法格式: 變數+?+函式名稱

獲取集合大小

我們使用size函式來實現得到某個集合的大小,程式碼如下:

共  ${phoneList?size}  條記錄

輸出結果:
image

  • 轉換JSON字串為物件

將json字串轉換為物件,

<br>轉換JSON字串<br>
<#assign text="{'city':'深圳','str':'寶安區新安街道'}" />
	<#assign data=text?eval />
城市:${data.city}    街區:${data.str}

輸出結果:
image

  • 日期格式化

程式碼中對變數賦值:

dataModel.put("today", new Date());
在模板檔案中加入
當前日期:${today?date} <br>
當前時間:${today?time} <br>   
當前日期+時間:${today?datetime} <br>        
日期格式化:  ${today?string("yyyy年MM月")}

執行效果如下:
image

  • 數字轉換為字串

程式碼中對變數賦值:

map.put("tostring", 123456781);

修改模板:

轉化後:${tostring}

有些時候我們不需要這個分隔符,就需要將數字轉換為字串,使用內建函式c

轉化後:${tostring?c}

頁面顯示效果如下:
image

  • 空值處理運算子

模板中使用了變數但是在程式碼中沒有對變數賦值,執行生成時會丟擲異常。

1.判斷某變數是否存在:“??”

用法為:variable??,如果該變數存在,返回true,否則返回false

<br>測試空字串<br>
<#if testnull??>
    testnull為空
<#else>
    testnull不為空
</#if>

2.缺失變數預設值:“!”
除了可以判斷是否為空值,也可以使用!對null值做轉換處理

<br>缺失變數預設值<br>
${nnull!'預設值'}

當aaa為null則返回!後邊的內容-

  • 運算子

算數運算子
FreeMarker表示式中完全支援算術運算,FreeMarker支援的算術運算子包括:+, - , * , / , %

邏輯運算子

邏輯與:&&

邏輯或:||

邏輯非:!

邏輯運算子只能作用於布林值,否則將產生錯誤

比較運算子

1.  =或者==:判斷兩個值是否相等. 
2.  !=:判斷兩個值是否不等. 
3.  >或者gt:判斷左邊值是否大於右邊值 
4.  >=或者gte:判斷左邊值是否大於等於右邊值 
5.  <或者lt:判斷左邊值是否小於右邊值 
6.  <=或者lte:判斷左邊值是否小於等於右邊值

注意:
=和!=可以用於字串,數值和日期來比較是否相等,但=和!=兩邊必須是相同型別的值,否則會產生錯誤,而且FreeMarker是精確比較,“x”,"x ","X"是不等的.

其它的執行符可以作用於數字和日期,但不能作用於字串,大部分的時候,使用gt等字母運算子代替>會有更好的效果,因為FreeMarker會把>解釋成FTL標籤的結束字元,當然,也可以使用括號來避免這種情況,如:<#if (x>y)>