一、从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> </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文档中。