FreeMarker對應各種資料結構解析

不學無數的程式設計師發表於2019-01-07

FreeMarker對應各種資料結構解析

FreeMarker 是一個採用 Java 開發的模版引擎,是一個基於模版生成文字的通用工具。 FreeMarker 被設計用來生成 HTML Web 頁面,特別是基於 MVC 模式的應用程式。雖然 FreeMarker 具有一些程式設計的能力,但通常由 Java 程式準備要顯示的資料,由 FreeMarker 生成頁面,並通過模板顯示準備的資料

FreeMarker簡單的工作原理

FreeMarker對應各種資料結構解析

所以FreeMarker可以針對於Java中儲存的各種資料結構進行解析,然後通過模板檔案進行輸出到指定的格式。接下來我們就簡單說明一下FreeMarker解析各種資料結構的語法是如何寫的。

基礎資料的解析

程式碼如下

        String name = "World!";
        FreemarkerUtil util = new FreemarkerUtil();
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("name",name);
        util.fprint("FreemarkerTest.ftl",resultMap,"FreemarkerTest");

複製程式碼

如果想將簡單的基礎資料輸入至模板檔案中FreemarkerTest.ftl中呢,在模板檔案中FreemarkerTest.ftl只需要如下寫即可

name:${name}
複製程式碼

在檔案中FreemarkerTest檔案中就會看到輸出的內容

FreeMarker對應各種資料結構解析

集合的解析

List集合

程式碼如下

List<String> list = new ArrayList<>();
list.add("Mazi");
list.add("LaoLiu");
resultMap.put("users",list);
複製程式碼

如果是想要遍歷上面程式碼中的list集合,那麼直接在模板檔案中如下寫即可

<#list users as item>
    name:${item}
</#list>

複製程式碼

其中users是傳入模板檔案中的key值,item只是取得一個別名,隨意即可,我們可以在生成的模板檔案中看到如下資訊

FreeMarker對應各種資料結構解析

如果集合中儲存的是物件呢?例如下

List<User> userList = new ArrayList<>();
userList.add(new User("Mazi",18));
userList.add(new User("Mazi2",18));
resultMap.put("userDatas",userList);
複製程式碼

模板檔案

<#list userDatas as user>
    name: ${user.name}
    age: ${user.age}
---------------------
</#list>

複製程式碼

檔案中列印如下

FreeMarker對應各種資料結構解析

Map集合

有如下的資料結構,Java程式碼如下

        Map<String,String> map = new HashMap<>();
        Map<String,Object> resultMap = new HashMap<>();
        map.put("name","Mazi");
        map.put("age","18");
        resultMap.put("map",map);

複製程式碼

想要在模板檔案中取出Map中的key值和Value只需要在模板檔案中如下寫即可

<#list map?keys as key>
    key: ${key}
    value: ${map[key]}
</#list>

複製程式碼

檔案中輸出如下

FreeMarker對應各種資料結構解析

複雜的資料結構解析

簡單的基礎資料型別和簡單的集合我們都能夠在模板檔案中解析出來資料了,那麼接下來我們瞭解一下如果是一個複雜的資料結構解析呢?例如是List<Map<String,String>>或者是Map<String,List<Strinbg>>這種的巢狀型的集合該如何解析呢?

例如我們有一個一對多的資料結構

FreeMarker對應各種資料結構解析

Java程式碼提下如下

        Map<String,Object> resultMap = new HashMap<>();
        Map<String,List<User>> testMap = new HashMap<>();
        List<User> listOne = new ArrayList<>();
        List<User> listTwo = new ArrayList<>();
        listOne.add(new User("王大麻子",11));
        listOne.add(new User("李二狗",11));
        listTwo.add(new User("鄭老六",11));
        listTwo.add(new User("吳大棒槌",11));
        testMap.put("classA",listOne);
        testMap.put("classB",listTwo);
        resultMap.put("data",testMap);
複製程式碼

那麼在模板檔案中該如下解析呢?如下


<#list data?keys as classKey >
    班級: ${classKey}

    成員如下:
    <#assign users = data[classKey]>
    <#list users as user>
        name: ${user.name}
        age: ${user.age}
    </#list>
</#list>

複製程式碼

assign這個標記是賦值的作用,此時如果直接<#list data[classKey] as user>會報錯,所以要先進行賦值然後再進行迴圈遍歷資料,檔案中列印如下

FreeMarker對應各種資料結構解析

相關文章