FreeMarker简单使用

什么是 FreeMarker?

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

FreeMarker项目中主要用途就是来渲染一些静态文件,例如html静态页面、word等等。在这篇博客里就简单介绍一下使用FreeMarker来通过ftl模板来渲染html和word。

首先贴出我用到的工具类和jar:

freemarker-2.3.20.jar

package com.utils;

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

/**
 * freemarker模板引擎渲染工具类
 * Created by wdq on 2018/12/24.
 */
public class FreeMarkerUtil {


        /**
         *   模板引擎常用渲染方式
         *    1.变量渲染     ${message}  支持date、boolean、string、integer
         *    2.数据迭代     <#list  userList as user></#list> 类似jstl的<c:foreach></c:foreach>
         *    3.条件判断
         *    <#if message=12>
         *    <#elseif message=13>
         *    <#else>
         *    </#if>
         */

        /**|
         * 渲染模板
         * @param templatePath  模板路径
         * @param templateName  模板名称
         * @param data   渲染数据
         * @param path   输出路径
         * @return
         */
    public static boolean applyTemplate(String templatePath,String templateName, Map<String,Object> data,String path){
            try{
                    //创建Configuration对象
                    Configuration config=new Configuration();
                    //设置模板路径
                    config.setDirectoryForTemplateLoading(new File(templatePath));
                    //设置编码格式
                    config.setDefaultEncoding("UTF-8");
                    //创建一个模板对象
                    Template template = config.getTemplate(templateName);
                    //指定渲染对象
                    File file = new File(path);
                    Writer writer=new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
                    //模板渲染
                    template.process(data, writer);
                    //关闭io流
                    writer.flush();
                    writer.close();
                    return true;
            }catch (Exception e){
                    return false;
            }
    }
}

 

1.FreeMarker渲染html

首先,你需要有一个编辑好样式的html文件(页面中引用js等静态资源注意使用http绝对路径),然后把页面中需要进行数据渲染的地方使用表达式替换,在这里我拿一个简单的页面举个例子,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title></title>
</head>
<body>
${message}

<#list ObjList as objs>
<p>${objs.name}</p>
</#list>

<#if message=12>
<p>我还小</p>
<#elseif message=13>
<p>我比你大</p>
<#else>
<p>我不告诉你</p>
</#if>
</body>
</html>

FreeMarker的数据渲染规则和jstl基本一样,在这里${message}就代表把数据中key为message的变量值展示到这个位置(支持富文本);和jstl有区别的是FreeMarker的数据迭代和if判断,在这里数据迭代使用的标签是<#list>,标签中直接把数据中的list进行foreach迭代objList as objs,把每一轮的值都赋给临时变量objs,在迭代中可以继续使用${objs.属性名}进行数据获取;FreeMarker中的if标签有点类似于java中的if,使用<#if  条件判断></#if>进行条件筛选。

按照FreeMarker的渲染格式编辑好模板后,可以把当前html改成.ftl文件,区分他是模板文件,然后就可以使用上面的工具类渲染页面了,添加数据的方式和java里向request中塞值一样。

Map<String,Object> data = new HashMap<String,Object>();
 data.put("message","<h1 style=\"color:red;\">FreeMarker 基本用法 FreeMarker和spring整合集成</h1>");
 List<String[]> list = new ArrayList<>();
 list.add(new String[]{"sadsdsa"});
 list.add(new String[]{"aaaaaaa"});
 data.put("list",list);    
           FreeMarkerUtil.applyTemplate("C:\\Users\\wdq\\Desktop","test.ftl",data,"C:\\Users\\wdq\\Desktop\\test.html");

 

2.Word模板生成

word的数据渲染和html的一样,但是word的模板创建比html要稍微复杂一点。首先你需要在office中根据你想要的样式编辑好word文档,需要替换的部分先拿测试数据填补,编辑好以后在word编辑器左上角“文件-->另存为”选择保存类型为“Word XML文档”,保存后使用note++打开这个xml文档,效果应该和下图类似:

xml文件中<w:开头的都是word的标签,在notepad++里使用快捷搜索之前写的测试数据,快速定位到需要渲染数据的位置,然后把测试数据用FreeMarker的渲染表达式替换,搞定以后保存并把后缀改为.ftl,之后就可以和渲染html一样给word渲染数据了。

 

如有更好的思路欢迎留言!!!