前言
因感概业务代码存在大量的增删改查功能,只是针对不同的表数据而已。故想有没有办法,在重复的相同代码中替换某些内容,于是按此思路搜寻,了解到有freemarker这个东西,一番学习后,特记录于此。
Freemarker简介
FreeMarker是一款模板引擎: 一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。即:输出=模板+数据。简单来说,其用法原理类似String的replace方法,或MessageFormat的format方法,都是在一定的代码中改变(替换)某些内容。不过FreeMarker更加强大,模板来源可以是外部文件或字符串格式,替换的数据格式多样,而且支持逻辑判断,如此替换的内容将更加灵活。
小例子
比如我们要产生实体类,我们将模板定义如下,模板文件名为entity.flt(flt是freemarker模板的后缀名)
package com.tenny.${interfaceName?lower_case}.entity;
import java.util.Date;
public class ${entityName} {
// ${param.fieldNote}
private ${param.fieldType} ${param.fieldName};
#list>
public void set${param.fieldName?cap_first}(${param.fieldType} ${param.fieldName}){
this.${param.fieldName} = ${param.fieldName};
}
public ${param.fieldType} get${param.fieldName?cap_first}(){
return this.${param.fieldName};
}
#list>
}
其中的${xxx}就是变量了,由外部传入。可以看到模板还有类似java for each循环的语法。
接下来我们要填充数据了。数据来源后面详细说,先假定我们有了数据。其格式为Map,内容为:
Map beanMap = new HashMap();
beanMap.put("beanName", "User");// 实体类名
beanMap.put("interfaceName", "User");// 接口名
List> paramsList = new ArrayList>();
for (int i = 0; i < 4; i++) {
Map tmpParamMap = new HashMap();
tmpParamMap.put("fieldNote", "fieldNote" + i);
tmpParamMap.put("fieldType", "String");
tmpParamMap.put("fieldName", "fieldName" + i);
paramsList.add(tmpParamMap);
}
beanMap.put("params", paramsList);
最后我们使用模板替换数据(这里我的模板放在resources/model/下,目标文件放在resources/class/下):
Configuration config = new Configuration();
config.setObjectWrapper(new DefaultObjectWrapper());
Template template = config.getTemplate("