FreeMarker是一款
模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(
HTML网页、
电子邮件、
配置文件、
源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker是
免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如
数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。
使用freemarker可以生成java代码,jsp,js等很多文件,下面看一个生成java代码的例子,使用freemarker需要懂得ftl模板的语法,因为它是通过ftl模板上配置生成的。
public abstract class AbstractGenerator {
/** 日志 */
protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractGenerator.class);
/**
* 生成代码
*
*
* @param param 数据
* @param templateConfig 模板配置
* @param ftlName 模板文件名称
* @param srcDir 源文件目录
* @param srcFile 源文件
*/
public static void generateCode(final Object param, final Configuration templateConfig, final String ftlName,
final String srcDir, final File srcFile) {
OutputStream objOS = null;
OutputStreamWriter objOSW = null;
Template objCodeTemplate = null;
Exception ex = null;
try {
FileUtil.mkdirs(srcDir);
// 获取模版
objCodeTemplate = templateConfig.getTemplate(ftlName);
objOS = new FileOutputStream(srcFile);
objOSW = new OutputStreamWriter(objOS, "UTF-8");
objCodeTemplate.process(param, objOSW);
} catch (FileNotFoundException e) {
ex = e;
} catch (UnsupportedEncodingException e) {
ex = e;
} catch (IOException e) {
ex = e;
} catch (TemplateException e) {
ex = e;
} finally {
IOUtils.close(objOS);
IOUtils.close(objOSW);
}
if (ex != null) {
LOGGER.error("生成代码出错.", ex);
throw new MetaDataException("生成代码出错。", ex);
}
}
/**
* 根据模版生成代码
*
* @param param 模版参数
* @param templateConfig 模版对象
* @param ftlName 模版名
* @return 生成的代码
*/
public static String generateCode(Object param, Configuration templateConfig, String ftlName) {
Template objCodeTemplate = null;
Writer objWriter = null;
try {
objCodeTemplate = templateConfig.getTemplate(ftlName);
objWriter = new StringWriter();
objCodeTemplate.process(param, objWriter);
} catch (IOException e) {
LOGGER.error("生成代码出错.", e);
} catch (TemplateException e) {
LOGGER.error("生成代码出错.", e);
}
return objWriter != null ? objWriter.toString() : null;
}
/**
* 获取模板配置
*
* @param ftlPath 模板文件相对路径
* @return 模板配置
*/
public static Configuration getTemplateConfig(String ftlPath) {
Configuration objTemplateConfig = new Configuration();
objTemplateConfig.setClassForTemplateLoading(Generator.class, ftlPath);
objTemplateConfig.setDefaultEncoding("UTF-8"); // 这个一定要设置,不然在生成的页面中 会乱码
return objTemplateConfig;
}
}