需求:现有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> 标签里的代码。

更多推荐

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