使用freemarker对模板进行渲染
最近项目中使用到了,对word模板进行编辑和渲染,所以使用到了模板引擎技术。
在项目中,我们前端使用的富文本编辑器,进行展示和保存(和word格式一致),后端采用了freemarker进行数据的渲染。前端,就不多说了,处理很简单,只有一个展示,一个保存操作。
后台,需要获取模板和数据,进行渲染后返回到前台,进行展示。
目前实现了输入字符串和输入文件两种形式。(20180409)
freemark技术的整合和使用如下:
1.引入maven依赖
<!-- https://mvnrepository.com/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 com.winning.polaris.comm.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日描述:这是描述信息==========
模板渲染完成。
当然,模板的渲染可以使用正则完成,但个人认为,模板引擎就是干这个的,而且各种情况考虑更为全面。
使用freemarker对模板进行渲染的更多相关文章
- FreeMarker的模板文件语法
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...
- flask 在模板中渲染错误消息
在模板中渲染错误消息 如果form.valicate_on_submit()返回False,说明验证没有通过,对于没有验证通过的字段,WTForms会把错误信息添加到表单类的errors属性中,这是一 ...
- flask 在模板中渲染表单
在模板中渲染表单 为了能够在模板中渲染表单,我们需要把表单类实例传入模板.首先在视图函数里实例化表单类LoginForm,然后再render_template()函数中使用关键脑子参数form将表单实 ...
- FreeMarker数据模板引擎全面教程mark
http://blog.csdn.net/fhx007/article/details/7902040/#comments 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复 ...
- Ajax接收Json数据,调用template模板循环渲染页面的方法
一. 后台接口吐出JSON数据 后台php接口中,需要写三个部分: 1.1 开头header规定数据格式: header("content-type:application/json;cha ...
- Vue2.0源码学习(1) - 数据和模板的渲染(上)
准备 一.首先去GitHub上把vue源码download下来,传送门:https://github.com/vuejs/vue 二.搭建一个vue-cli跑起来,用于代码调试,不看着代码动起来只看源 ...
- Spring Boot☞ 使用freemarker模板引擎渲染web视图
效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...
- iOS:使用模板引擎渲染HTML界面
在实际开发中,UIWebView控件接受一个HTML内容,用于相应的界面,下面是该API的接口: - (void)loadHTMLString:(NSString *)string baseURL:( ...
- JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)
1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...
随机推荐
- JAVA获取运行程序的src路径
JavaPrj使用: System.getProperty("user.dir")+"\\src"或直接"\\src"JavaWeb使用Th ...
- Python直接改变实例化对象的列表属性的值 导致在flask中接口多次请求报错
错误原理实例如下: class One(): list = [1, 2, 3] @classmethod def get_copy_list(cls): # copy一份list,这样对list的改变 ...
- Linux 查看各文件夹大小命令du -h --max-depth=1
du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-de ...
- django 数据库查询的几个知识点
django查询db过程中遇到的几个问题: 1. 数据库切换,用using products = models.TProductCredit.objects.using(') 2.查询结构集是Quer ...
- 如何创建.gitignore文件,忽略不必要提交的文件
1.gitignore 在工程实现过程中,会生成一些中间文件,或者在项目中的部分文件是不需要进行版本管理的.对于这些文件应该对于Github来讲是透明的.Github提供这种功能,可以自己指定哪些文件 ...
- html网页练习豆瓣网
html </head> <body> <!-- 头部 --> <header class="header1"> ...
- SpringCloud详解
来源于纯洁的微笑 http://www.ityouknow.com/spring-cloud.html
- AngularJS学习笔记(二)
一.AngularJS Select(选择框) 1.使用 ng-options 创建选择框 <div ng-app="myApp" ng-controller="m ...
- 整数中1出现的次数(从1到n整数中1出现的次数)(python)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 20175314 《Java程序设计》第三周学习总结
20175314 <Java程序设计>第三周学习总结 教材学习内容总结 编程语言的发展事是从面向机器(汇编.机器)到面向过程(C)再到面向对象(Java) 成员变量: 1.成员变量定义在类 ...