不学无数——FreeMarker对应各种数据结构解析

FreeMarker对应各种数据结构解析

Posted by 不学无数 on November 8, 2018

FreeMarker对应各种数据结构解析

FreeMarker 是一个采用 Java 开发的模版引擎,是一个基于模版生成文本的通用工具。 FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。虽然 FreeMarker 具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由 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文件中就会看到输出的内容

集合的解析

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只是取得一个别名,随意即可,我们可以在生成的模板文件中看到如下信息

如果集合中存储的是对象呢?例如下

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>

文件中打印如下

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>

文件中输出如下

复杂的数据结构解析

简单的基础数据类型和简单的集合我们都能够在模板文件中解析出来数据了,那么接下来我们了解一下如果是一个复杂的数据结构解析呢?例如是List<Map<String,String>>或者是Map<String,List<Strinbg>>这种的嵌套型的集合该如何解析呢?

例如我们有一个一对多的数据结构

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>会报错,所以要先进行赋值然后再进行循环遍历数据,文件中打印如下