您的位置:

Freemarker循环list的使用指南

一、从Freemarker循环list里的Map开始

Map是List中最常见的元素类型之一。在Freemarker中,使用Map的方法和使用单独的对象差不多。下面我们来看一个例子:

<#list mapList as map>
    <tr>
        <td>${map.name}</td>
        <td>${map.age}</td>
        <td>${map.email}</td>
    </tr>
</#list>

这段代码会循环输出一个Map List类型的表格,表格中的每一行都代表一个Map对象。${map.name}、${map.age}和${map.email}代表了这个Map对象中的三个属性。这个方式也可以用来循环输出一个List的元素。

除了这个简单的例子外,我们还可以使用JavaBean作为元素类型,例如:

class User {
    private String name;
    private int age;
    private String email;
    // getter & setter 略
}
<#list userList as user>
    <tr>
        <td>${user.name}</td>
        <td>${user.age}</td>
        <td>${user.email}</td>
    </tr>
</#list>

这样就能循环输出一个User List的表格了。

二、Freemarker循环内容

在Freemarker中,使用#list指令可以帮助我们很容易地循环输出元素。除此之外,我们还可以通过#compress指令来去除循环输出的空白和换行。下面是一个例子:

<#list users as user><#compress>${user.name}</#compress></#list>

这段代码会输出一个连续的字符串,其中包含了users列表中所有用户的名字,而且没有任何多余的空格和换行。

我们也可以使用#sep指令来指定循环输出元素之间的分隔符。例如,下面的代码会输出所有用户的名字,用逗号隔开:

<#list users as user><#compress>${user.name}</#compress><#sep>, </#sep></#list>

三、Freemarker循环嵌套

循环嵌套是Freemarker中最常见的操作之一。

下面是一个例子,我们将循环输出一个Map对象列表,这个Map里面包含了一些其他列表对象:

<#list userGroupList as userGroup>
    <h2>${userGroup.name}</h2>
    <#list userGroup.users as user>
        <tr>
            <td>${user.name}</td>
            <td>${user.age}</td>
            <td>${user.email}</td>
        </tr>
    </#list>
</#list>

这段代码可以循环输出一个包含多个列表的Map对象。

四、Freemarker循环图表

利用Freemarker循环列表,我们可以在HTML中很容易地创建图表。首先,我们需要准备好一个二维数组,并将其绑定到参数中,代码如下:

<#assign chartData = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]>

然后我们使用#list来循环输出这个数组:

<table>
    <#list chartData as row>
        <tr>
            <#list row as cell>
                <td>${cell}</td>
            </#list>
        </tr>
    </#list>
</table>

这段代码会生成一个简单的二维表格,可以轻松地将其转化为图表。

五、Freemarker循环生成多个表格

在生成多个表格时,我们可以使用类似下面的一些代码:

<#list tableData as table>
    <h2>${table.title}</h2>
    <table>
        <#list table.rows as row>
            <tr>
                <#list row.cells as cell>
                    <td>${cell}</td>
                </#list>
            </tr>
        </#list>
    </table>
</#list>

这段代码循环输出有多个不同标题的表格。使用#list指令,我们可以很容易地控制每个表格的输出格式。

六、Freemarker循环填充空表格

有时候我们需要循环填充空表格,例如:

<table>
    <#list 0..2 as rowIdx>
        <#list 0..3 as colIdx>
            <td>&nbsp;</td>
        </#list>
    </#list>
</table>

这段代码会输出一个3行4列的空表格,每个单元格的内容都是空格。

七、Freemarker循环生成文本框

有时候我们还需要使用文本框来直接获取用户的输入。我们可以使用下面的代码:

<#list employees as employee>
    <tr>
        <td>${employee.name}</td>
        <td><input type="text" name="age_${employee.id}" value="${employee.age}"></td>
        <td><input type="text" name="email_${employee.id}" value="${employee.email}"></td>
    </tr>
</#list>

这样,我们就可以循环生成多个带有文本框的表格了。

八、Freemarker循环if

在循环中使用if条件语句可以很方便地对元素进行过滤或分类。例如,下面这个代码会输出所有年龄小于30岁的用户:

<#list users as user>
    <#if user.age < 30>
        <tr>
            <td>${user.name}</td>
            <td>${user.age}</td>
            <td>${user.email}</td>
        </tr>
    </#if>
</#list>

同样的方法我们还可以输出年龄大于30岁的用户,或者所有偶数年龄的用户等等。

九、Freemarker循环map

我们前面介绍过循环输出列表中的Map类型元素,这里我们来看一下如果输出一个独立的Map对象。

<#assign user = {name: "Tom", age: 20, email: "tom@freemarker.com"}>
<#list user?keys as key>
    <tr>
        <td>${key}</td>
        <td>${user[key]}</td>
    </tr>
</#list>

这段代码会输出user这个Map对象中的所有键值对,只需要循环输出Map的keys即可。

十、Freemarker循环导出word带图片

我们可以利用Freemarker在生成Word文档的时候自动插入图片,代码示例如下:

<#list imgList as img>
    <img src="data:image/jpeg;base64,${img.content}" />
    <br>
</#list>

注意这里的imgList是一个List类型的对象,其中每个对象都包含了要插入的图片。这段代码会自动将这些图片循环插入Word文档中。