使用freemarker对模板进行渲染
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使⽤freemarker对模板进⾏渲染
最近项⽬中使⽤到了,对word模板进⾏编辑和渲染,所以使⽤到了模板引擎技术。
在项⽬中,我们前端使⽤的富⽂本编辑器,进⾏展⽰和保存(和word格式⼀致),后端采⽤了freemarker进⾏数据的渲染。前端,就不多说了,处理很简单,只有⼀个展⽰,⼀个保存操作。
后台,需要获取模板和数据,进⾏渲染后返回到前台,进⾏展⽰。
⽬前实现了输⼊字符串和输⼊⽂件两种形式。(20180409)
freemark技术的整合和使⽤如下:
1.引⼊maven依赖
<!-- https:///artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
2.封装为utils⼯具类使⽤
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.PropertyConfigurator;
import com.winning.Application;
import com.winning.polaris.admin.service.impl.UpgradeServiceImpl;
import m.util.LogUtil;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class FreemarkerUtils {
private static LogUtil logger = LogUtil.getInstance(UpgradeServiceImpl.class);
private static String defaultCharacter = "UTF-8";
private static Configuration cfg;
private FreemarkerUtils() {
}
static {
cfg = new Configuration(Configuration.getVersion());
cfg.setDefaultEncoding(defaultCharacter);
cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
}
/**
* 对模板进⾏渲染
* @param data 数据Map
* @param tplStr 模板
* @return
*/
public static String generateString(
Map<String, Object> data, String tplStr) {
String result = null;
String name="myStrTpl";
try {
StringTemplateLoader stringTemplateLoader= new StringTemplateLoader();
stringTemplateLoader.putTemplate(name, tplStr);
cfg.setTemplateLoader(stringTemplateLoader);
Template template = cfg.getTemplate(name,defaultCharacter);
StringWriter out = new StringWriter();
template.process(data, out);
out.flush();
result= out.toString();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 将模板渲染以后保存到⽂件
* @param templateFileDir 模板⽬录
* @param fileName 模板⽂件名称
* @param targetFilePath 渲染后⽂件名称
* @param dataMap 数据
* @return
*/
public static boolean renderingTemplateAndGenerateFile(String templateFileDir,
String fileName,String targetFilePath,Map<String, Object> dataMap){
boolean flag=true;
try {
// 设置⽂件所在⽬录的路径
cfg.setDirectoryForTemplateLoading(new File(templateFileDir));//模板路径
// 获取模版
Template template = cfg.getTemplate(fileName);
// 设置输出⽂件名,和保存路径
File outFile = new File(targetFilePath);
// 将模板和数据模型合并⽣成⽂件重点设置编码集
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
// ⽣成⽂件
template.process(dataMap, out);
// 关闭流
out.flush();
out.close();
} catch (Exception e) {
logger.error("⽣产模板⽂件失败!",e);
flag=false;
}
return flag;
}
public static void main(String[] args) {
PropertyConfigurator.configure(Application.class.getClassLoader().getResourceAsStream("config" + File.separator + "log4j.properties"));
Map<String,Object> dataMap=new HashMap<String, Object>();
dataMap.put("APP_HOME", "c:/test/appHome");
//F:\freemark
boolean renderingTemplateAndGenerateFile = renderingTemplateAndGenerateFile("F:\\freemark\\", "temp.txt",
"F:\\freemark\\temp.bat",dataMap);
System.out.println(renderingTemplateAndGenerateFile);
}
}
3.单元测试
public class FreemarkerUtilsTest extends TestCase {
public void generateStringTest(){
Map<String,Object> map= new HashMap<>();
map.put("date", "2017-05-11 11:55:55");
map.put("caseNo", "AJ00000001");
map.put("descrip", "这是描述信息==========");
String template="案件编号为:${caseNo!} "
+ " ⽇期为:${date!} "
+ " ⾃动获取⽇期为:${ .now?string('yyyy年MM⽉dd⽇')}"
+ "描述:${descrip!}";
String generateString = FreemarkerUtils.generateString(map, template);
System.out.println("------");
System.out.println(generateString);
}
}
结果:案件编号为:AJ00000001 ⽇期为:2017-05-11 11:55:55 ⾃动获取⽇期为:2018年01⽉29⽇描述:这是描述信息==========模板渲染完成。
当然,模板的渲染可以使⽤正则完成,但个⼈认为,模板引擎就是⼲这个的,⽽且各种情况考虑更为全⾯。