最近项目中使用到了,对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对模板进行渲染的更多相关文章

  1. FreeMarker的模板文件语法

    FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...

  2. flask 在模板中渲染错误消息

    在模板中渲染错误消息 如果form.valicate_on_submit()返回False,说明验证没有通过,对于没有验证通过的字段,WTForms会把错误信息添加到表单类的errors属性中,这是一 ...

  3. flask 在模板中渲染表单

    在模板中渲染表单 为了能够在模板中渲染表单,我们需要把表单类实例传入模板.首先在视图函数里实例化表单类LoginForm,然后再render_template()函数中使用关键脑子参数form将表单实 ...

  4. FreeMarker数据模板引擎全面教程mark

    http://blog.csdn.net/fhx007/article/details/7902040/#comments 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复 ...

  5. Ajax接收Json数据,调用template模板循环渲染页面的方法

    一. 后台接口吐出JSON数据 后台php接口中,需要写三个部分: 1.1 开头header规定数据格式: header("content-type:application/json;cha ...

  6. Vue2.0源码学习(1) - 数据和模板的渲染(上)

    准备 一.首先去GitHub上把vue源码download下来,传送门:https://github.com/vuejs/vue 二.搭建一个vue-cli跑起来,用于代码调试,不看着代码动起来只看源 ...

  7. Spring Boot☞ 使用freemarker模板引擎渲染web视图

    效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...

  8. iOS:使用模板引擎渲染HTML界面

    在实际开发中,UIWebView控件接受一个HTML内容,用于相应的界面,下面是该API的接口: - (void)loadHTMLString:(NSString *)string baseURL:( ...

  9. JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)

    1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...

随机推荐

  1. laydate.js在火狐下的定位问题

    这个情况不知道在火狐的什么情况下会出现这个问题,但是他的demo定位在火狐下是没有问题的. 正常情况下展示位置是这样的 但是呢,在我的火狐下展示的位置是这样的. 哎,默默的读源码吧: 源码: 修改后的 ...

  2. Keras处理已保存模型中的自定义层(或其他自定义对象)

    如果要加载的模型包含自定义层或其他自定义类或函数,则可以通过 custom_objects 参数将它们传递给加载机制: from keras.models import load_model # 假设 ...

  3. Java笔试面试题整理第八波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  4. C# 自定义异常的方法源码演示及说明

    内容之余,把做工程过程中较好的内容段备份一下,下边内容是关于C# 自定义异常的方法演示及说明的内容,希望能对各位朋友有一些好处. using System;using System.Collectio ...

  5. Django和SQLAlchemy,哪个Python ORM更好?

    ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...

  6. delete content on the right of cursor, Mac

    delete content on the right of cursor, Mac It's not convenient to press Fn+delete to delete content ...

  7. <记录> curl 封装函数

    1. POST请求 参数1 : 请求地址 参数2 : 数组形式的参数 /** * @param string $url post请求地址 * @param array $params * @retur ...

  8. python爬虫之解析库Beautiful Soup

    为何要用Beautiful Soup Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式, 是一个 ...

  9. 通过adb启动app应用

    由于某些原因,我需要自动启动雷电模拟器里面的一个应用.(利用Windows任务计划) 怎么自启动雷电模拟器就不用说了,很简单. 自启动app我倒是不熟悉,我没用安卓方面的知识.再官网论坛上面查到了相关 ...

  10. RGB ECT 4BIT 压缩后质量远高于RGB ETC2 4BIT

    今天突然发现这个.原来以为ETC2在任何方面都强于ETC,没想到...用了RGB ETC2 4BIT 压缩的贴图看起来有点糊,改用RGB ECT 4BIT后竟然非常清晰,而且大小与RGB ECT2 4 ...