import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
@Component
public class FTLGenerateUtil {
private static Logger logger=LoggerFactory.getLogger(FTLGenerateUtil.class);
private static Configuration cfg;
private static String FILE_IN_PATH;
@Value("${ftl.in.path:'/usr/template/'}")
public void setFileInPath(String ftlInPath) {
FILE_IN_PATH = ftlInPath;
}
static {
cfg = new Configuration(Configuration.VERSION_2_3_23);
try {
// 设置默认编码
cfg.setDefaultEncoding("UTF-8");
//错误信息输出到控制台
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
} catch (Exception e) {
e.printStackTrace();
logger.error("初始化freemark失败",e);
}
}
/**
* @Title: createHtmlByMode
* @Description: TODO(生成静态文件)
* @param outPath 模板文件输出路径
* @param modeName 模板文件名
* @param targetFileName 输出静态文件路径
* @param params 数据对象
* @author gangyu2
* @date 2019年1月14日上午10:36:56
*/
public static void createHtmlByMode(String outPath,String modeName, String targetFileName, Object params) throws Exception {
logger.info("生成静态文件开始========》开始");
logger.info("模板文件输出路径:"+outPath);
logger.info("文件名:"+modeName);
logger.info("输出静态文件路径:"+outPath+targetFileName);
Writer out = null;
//找到服务器缓存目录,可以自己指定目录
String folder = outPath;
//通过匹配路径格式拼接完整生成路径
String outFile = folder + targetFileName;
try {
//创建文件夹
File dir=new File(folder);
if(!dir.exists()){
dir.mkdirs();
}
//TODO 创建模版对象
//基于文件系统
cfg.setDirectoryForTemplateLoading(new File(FILE_IN_PATH));
// //基于类路径
// cfg.setClassForTemplateLoading(FreemarkerMain.class.getClass(), "/templates");
// //基于Servlet Context
// HttpServletRequest request = ServletActionContext.getRequest();
// cfg.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/templates");
//framemaker.ftl为要装载的模板
Template template = cfg.getTemplate(modeName);
// 设置输出流
out = new OutputStreamWriter(new FileOutputStream(file));
// 模版数据插入参数,通过输出流插入到HTML中
template.process(params, out);
logger.info("生成静态文件开始========》结束");
}finally {
if (null != out) {
out.flush();
out.close();
logger.info("释放输出流");
}
}
}
}