自定义函数
1. 实现TemplateMethodModelEx接口
2. 实现其中exec()方法
//args是自定义函数的所有参数的lis集合
public Object exec(List args) throws TemplateModelException {
//获取的参数需要转化为SimpleSequence对象, freemarker的数据模型对象
SimpleSequence arg0 = (SimpleSequence) args.get(0);
List<BigDecimal> list = arg0.toList(); //将第一个参数转为它原本的类型, 在freemarkeer 2.3.22之后该方法被标记为过时的(@Deprecated)
//实现的代码
return object;
}
3. 将该实现类对象传递给html页面,参数名就是freemarker自定义函数的函数名
modelAndView.addObject("函数名", templateMethodModelEx);
4. 在html中直接通过函数名()调用自定义函数
注: 不使用simpleSequence.toList()方法转换simpleSequence封装的list的方式(网上尚未查询到相关资料,该方式是基于simpleSequence.toList()的源码和官方api编写的)
1. SimpleSquence simpleSequence = (SimpleSequence) args.get(0);
2. 根据页面传递过来的list类型重新创建新的list
List<Integer> list = new ArrayList<>();
3. 获取DefaultObjectWrapperBuilder对象
DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Cinfiguration.getVersion()); //Cinfiguration.getVersion()自动获取当前freemarker的版本
4. 创建DefaultObjectWrapper对象
DefaultObjectWrapper objectWrapper = builder.build();
5. 遍历simpleSequence(遍历的每个元素都是TemplateModel对象), 使用DefaultObjectWrapper的unwrap()或tryUnwrapTo()方法将TemplateModel转化为Java类型,向list添加转化后的对象
for (int i=0; i < simpleSequence.size(); i++) {
list.add(objectWrapper.unwrap(simpleSequence.get(i), Integer.class));
}
6. 根据需求处理list并将处理后的list返回页面
自定义函数
需要实现 implements TemplateMethodModelEx,然后重写exec方法