需求:现有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");
}
}