转载

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("Mazi",11));
        listOne.add(new User("Ergou",11));
        listTwo.add(new User("Laoliu",11));
        listTwo.add(new User("Bangchui",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对应各种数据结构解析
原文  https://juejin.im/post/5c32de4751882526300b6bec
正文到此结束
Loading...