使用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 是在是太乱了,整理 ...
随机推荐
- Hibernate Criteria使用
hibernate中Criteria的完整用法 Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现.SQL语句如何编写,是Hibernate框架的核心 ...
- docker 在window10下的安装
在win10下安装docker 打开下载页面 https://store.docker.com/editions/community/docker-ce-desktop-windows 打开控制面板 ...
- composer在phpstorm中安装代码库
E:\php\PHPTutorial\WWW\kmmhtt>composer install composer 安装地址 :https://getcomposer.org/download/
- bootstrap的日期选择器
时间框偏移解决办法 首先导入js和css文件 <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js" ...
- 分布式 +rides
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法
1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...
- Hive 任务优化 tips
1. 集群任务队列: 一般有 root.default, root.online, root.offline, root.spark-thiftserver Hue提交的任务一般默认在 defau ...
- SpringBoot 之jsp
Boot 内嵌的tomcat 是不支持jsp 的, jetty 也是. 虽然boot也是有默认配置一个InternalResourceViewResolver ,但是它并不像我们在springmvc ...
- background-position,有逗号和没逗号:截然不同的结果
写星级评分demo的时候,发现background-position这个属性有点神奇 如上图,在其值中加“,”与不加“,”会带来截然不同的结果,来研究一哈,顺便把这个属性复习一下 1.backgrou ...
- 第三篇、Python函数
1.函数和过程的定义: 1) 函数定义:函数是逻辑结构化和过程化的一种编程方法. 2) 过程定义:过程就是简单特殊没有返回值的函数. 当一个函数/过程没有使用return显示的定义返回值时,pytho ...