FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码"。
比如Java中三层架构,数据访问层,业务逻辑层,表现层,光这三层就出现重复性的增删改查及其相关的界面代码。
如何不写重复的增删改查相关的代码,可以参考我的MP实战系列文章和MyBatis的逆向工程(针对Java相关框架):
其中MP实战系列(六)之代码生成器讲解 用的是volocity模板引擎。原理与FreeMarker本质上是一致的,这个本质一致,你可以理解为都是基于已有的模板进行代码生成。
下面进入简单示例讲解:
一、导入maven依赖
4.0.0
cn.test
freemarket
0.0.1-SNAPSHOT
war
org.freemarker
freemarker
2.3.23
org.apache.maven.plugins
maven-compiler-plugin
2.0.2
1.8
1.8
${project.artifactId}
二、新建com.freemarker.hello.templates包,并在该包下编写模板文件test.ftl
package${classPath};public class${className} {privateInteger ${Id};privateString ${userName};privateString ${password};publicInteger get${Id}(){return${Id};
}public voidset${Id}(Integer ${Id}){this.${Id}=${Id};
}publicString get${userName}(){return${userName};
}public voidset${userName}(String ${userName}){this.${userName}=${userName};
}publicString get${password}(){return${password};
}public voidset${password}(String ${password}){this.${password}=${password};
}
}
三、编写运行生成对应Java代码类
packagecom.freemark.hello;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileOutputStream;importjava.io.OutputStreamWriter;importjava.io.Writer;importjava.util.HashMap;importjava.util.Map;importfreemarker.template.Configuration;importfreemarker.template.Template;public classFreemarkerDemo {private static final String TEMPLATE_PATH = "src/main/java/com/freemark/hello/templates";private static final String CLASS_PATH = "src/main/java/com/freemark/hello";public static voidmain(String[] args) {//step1 创建freeMarker配置实例
Configuration configuration = newConfiguration();
Writer out= null;try{//step2 获取模版路径
configuration.setDirectoryForTemplateLoading(newFile(TEMPLATE_PATH));//step3 创建数据模型
Map dataMap = new HashMap();
dataMap.put("classPath", "com.freemark.hello");
dataMap.put("className", "User");
dataMap.put("Id", "Id");
dataMap.put("userName", "userName");
dataMap.put("password","password");//step4 加载模版文件
Template template = configuration.getTemplate("test.ftl");//step5 生成数据
File docFile = new File(CLASS_PATH + "\\" + "User.java");
out= new BufferedWriter(new OutputStreamWriter(newFileOutputStream(docFile)));//step6 输出文件
template.process(dataMap, out);
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^User.java 文件创建成功 !");
}catch(Exception e) {
e.printStackTrace();
}finally{try{if (null !=out) {
out.flush();
}
}catch(Exception e2) {
e2.printStackTrace();
}
}
}
}
四、步骤三成功,刷新(refresh)项目即可,看到com.freemark.hello有一个User类
小结:该示例非常简单,freemarker的强大不足以在此体现,不过该示例对于初学者或者准备研究freemarker的开发者有一定的启示意义。
比如:遵守"DRY原则",对于开发效率的提高,帮助非常大。