Freemarker详解



Freemarker是一款模板引擎,是一种基于模版生成静态文件的通用工具,它是使用纯java编写的,一般用来生成HTML页面。

原理

Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。

FreeMarker模板文件

  1. 文本,直接输出的部分
  2. 注释,即<#--...-->格式不会输出
  3. 插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出
  4. FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
<html>
<body>  
<#-- 注释部分 -->
<br>  
<#-- 下面使用插值 -->  
<h1>Welcome ${user} !</h1>
<p>We have these animals:
<u1>
<#-- 使用FTL指令 -->  
<#list animals as being>
<li>${being.name} </li>
<#list>
<u1>
</body>
</html>

指令

1. list

<#list nameList as names>    
  ${names}   
</#list>

主要是进行迭代服务器端传递过来的List集合,name是list循环的时候取的一个循环变量.相关指令

item_index:当前变量的索引值 item_has_next:是否存在下一个对象 break:跳出迭代

2. if指令

<#if (names=="javaschool")>  
 请访问:www.codingdict.com  
</#if>

该标签主要是做if判断用的,要注意的是条件等式必须用括号括起来。

3. include

<#include filename>
<#include filename options>

该标签用于导入文件。option包含下面2种属性:

encoding=”GBK” 编码格式
parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true”

<#include "include.html"/>  
<#include "/common/copyright.ftl" encoding=”GBK”>

4. switch , case , default , break指令

<#switch value>
<#case refValue>...<#break>
<#case refValue>...<#break>
<#default>...
</#switch>

5. import指令

<#import path as hash>

类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件。

6. noparse指令

<#noparse>...</#noparse>

noparse指令指定FreeMarker不处理该指定里包含的内容。

<#noparse>
<#list books as book>
   <tr><td>${book.name}<td>作者:${book.author}
</#list>
</#noparse>

7. escape,noescape指令

<#escape identifier as expression>...
<#noescape>...</#noescape>
</#escape>

escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值。

8. assign指令

<#assign name=value> or <#assign name1=value1 name2=value2 ... nameN=valueN>

<#assign same as above... in namespacehash>

<#assign name>
  capture this
</#assign>

<#assign name in namespacehash>
  capture this
</#assign>

assign指令用于为该模板页面创建或替换一个顶层变量。

9. setting指令

<#setting name=value>

该指令用于设置FreeMarker的运行环境,name的取值范围包含如下几个:

locale:该选项指定该模板所用的国家/语言选项

number_format:指定格式化输出数字的格式

boolean_format:指定两个布尔值的语法格式,默认值是true,false

date_format,time_format,datetime_format:指定格式化输出日期的格式

time_zone:设置格式化输出日期时所使用的时区

搭建Freemarker环境

  1. 使用maven来构建,pom.xml下载jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>org.wxp.freemarker</groupId>  
  <artifactId>freemarker01</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>jar</packaging>  
  <name>freemarker01</name>  
  <url>http://maven.apache.org</url>  
  <properties>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  </properties>  
  <dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>4.10</version>  
      <scope>test</scope>  
    </dependency>  

    <!-- Freemarker -->  
    <dependency>  
        <groupId>org.freemarker</groupId>  
        <artifactId>freemarker</artifactId>  
        <version>2.3.20</version>  
    </dependency>         
  </dependencies>  
</project>

2. 创建Freemarker根据数据和模型生成Html页面的工具类FreemarkerUtil

package test.freemarker;  
import java.io.File;  
import java.io.FileWriter;  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.util.Map;  
import freemarker.template.Configuration;  
import freemarker.template.Template;  
import freemarker.template.TemplateException;  
public class FreemarkerUtil {  
    public Template getTemplate(String name) {  
        Template temp = null;  
        try {  
            // 通过Freemarker的Configuration读取相应的Ftl  
            Configuration cfg = new Configuration();  
            // 设定去哪里读取相应的ftl模板  
            cfg.setClassForTemplateLoading(this.getClass(), "/ftl");  
            // 在模板文件目录中寻找名称为name的模板文件  
            temp = cfg.getTemplate(name);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return temp;  
    }  

    /**
     * 控制台输出文件内容
     * @param name
     * @param rootMap
     */  
    public void print(String name, Map<String, Object> rootMap) {  
        try {  
            // 通过Template类可以将模板文件输出到相应的文件  
            Template temp = this.getTemplate(name);  
            temp.process(rootMap, new PrintWriter(System.out));  
        } catch (TemplateException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  

    /**
     * 将替换后的模板内容输出到文件
     * @param name
     * @param rootMap
     * @param outFile
     */  
    public void fprint(String name, Map<String, Object> rootMap, String outFile) {  
        FileWriter out = null;  
        try {  
            out = new FileWriter(new File("D:\\freemarker\\ftl\\html\\"  
                    + outFile));  
            Template template = this.getTemplate(name);  
            template.process(rootMap, out);  
        } catch (TemplateException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            if (null != out)  
                try {  
                    out.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
        }  
    }  
}

3. 来创建Freemarker的模板ftl文件

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
</head>  
<body>  
    你好,${username}  
</body>  
</html>

4. 测试生成html页面

package test.freemarker;  
import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.Date;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
import org.junit.Before;  
import org.junit.Test;  
import org.wxp.freemarker.model.User;  
public class TestFreemarker {  
    private FreemarkerUtil freemarkerUtil;  
    private Map<String, Object> rootMap = null;  
    @Before  
    public void setUp() {  
        freemarkerUtil = new FreemarkerUtil();  
        rootMap = new HashMap<String, Object>();  
    }  

    @Test  
    public void test01() {  
        // 填充数据  
        rootMap.put("username", "codingdict");  
        // 打印到控制台  
        freemarkerUtil.print("01.ftl", rootMap);  
        // 输出到文件  
        freemarkerUtil.fprint("01.ftl", rootMap, "01.html");  
    }  
}

运行结果生成html页面

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   
</head>  
<body>  
    你好,codingdict
</body>  
</html>

总结

  1. FreeMarker是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包,或者说是一个类库。

  2. FreeMarker 不是 Web 开发的应用程序框架。它是一个适用于Web应用程序框架中的组件,但是FreeMarker引擎本身并不知道 HTTP协议或 Java Servlet 的存在。它仅仅来生成文本内容。