Freemarker模板引擎学习,生成html里的动态表格,可合并单元格

    xiaoxiao2022-07-13  167

    需求:现有html模板,需动态填充数据,并且包含表格,表格大小不固定,根据数据多少确定表格大小。

    解析:两种方案:

    1.java代码实现:将模板文件读出为StringBuffer,找到特定位置,循环生成表格的行,并替换指定参数(rowspan)的值以合并单元格。
    2.freemarker模板引擎,修改模板文件,使其根据参数生成表格,添加freemarker工具类,调用指定方法,填充数据。
    我两种方式都实现了,第一种比较简单,要花点时间,现不再讨论。以下为freemarker实现方式:
    FreemarkerUtil代码:
    package com.zhengwei.controller; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreemarkerUtil { public Template getTemplate(String name) { try { // 通过Freemaker的Configuration读取相应的ftl Configuration cfg = new Configuration(); // 设定去哪里读取相应的ftl模板文件 cfg.setDirectoryForTemplateLoading(new File("src/main/java/com/zhengwei/ftl")); // 在模板文件目录中找到名称为name的文件 Template temp = cfg.getTemplate(name); return temp; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 输出HTML文件 * * @param name * @param root * @param outFile */ public void fprint(String name, Map<String, Object> root, String outFile) { FileWriter out = null; try { // 通过一个文件输出流,就可以写到相应的文件中,此处用的是绝对路径 out = new FileWriter(new File("C:/Users/Administrator/Desktop/服务体系/payment/html/" + outFile)); Template temp = this.getTemplate(name); // 我这里是输出到文件,如果有其他需求就按照需求做,只要执行temp.process方法就行 temp.process(root, out); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
    修改模板文件index.ftl

    写个测试类TreemarkerTest:
    package com.zhengwei.controller; import com.zhengwei.entity.GoodsPackage; import com.zhengwei.entity.Group; import com.zhengwei.entity.OrderInfo; import com.zhengwei.entity.User; import org.junit.Test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class FreemarkerTest { @Test public void test(){ FreemarkerUtil util = new FreemarkerUtil(); Map<String, Object> map = new HashMap<String, Object>(); //构建数据 OrderInfo orderInfo = new OrderInfo(); orderInfo.setGoodsName("漫途定位服务"); List<GoodsPackage> goodsPackageList = new ArrayList<>(); long totalTimes = 0; long totalPrice = 0; for( int i =0 ;i < 5; i++){ GoodsPackage goodsPackage = new GoodsPackage(); goodsPackage.setGoodsPackageName("测试包00" + i); goodsPackage.setTimes(1000); goodsPackage.setPrice(2); goodsPackage.setGoodsPackageDate(12); goodsPackage.setGoodsPackageNo(3); if( i == 0){ //只有一个资费包的情况 orderInfo.setSingleGoodsPackage(goodsPackage); }else { goodsPackageList.add(goodsPackage); } totalTimes += goodsPackage.getTimes() * goodsPackage.getGoodsPackageNo(); totalPrice += goodsPackage.getPrice() * goodsPackage.getGoodsPackageNo(); } orderInfo.setTotalTimes(totalTimes); orderInfo.setTotalPrice(totalPrice); long PackageNo = goodsPackageList.size()+1; map.put("PackageNo",PackageNo); map.put("goodsPackageList",goodsPackageList); map.put("orderInfo",orderInfo); util.fprint("index.ftl", map ,"freemarker.html"); } }
    执行测试案例,得到如图所示的效果:

    解析:<#list goodsPackageList as goodsPackage>标签会将存入list的数据依次取出来,如果有数据,就创建一个tr,并放入数据,直到数据取完。如果没数据,就不执行<#list> 标签里的代码。
    最新回复(0)