Freemarker是一款模板引擎,是一种基于模版生成静态文件的通用工具,它是使用纯java编写的,一般用来生成HTML页面。
原理
Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。
FreeMarker模板文件
- 文本,直接输出的部分
- 注释,即<#–…-->格式不会输出
- 插值(Interpolation):即${…}或者#{…}格式的部分,将使用数据模型中的部分替代输出
- 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>
指令
list
<#list nameList as names>
${names}
</#list>
主要是进行迭代服务器端传递过来的List集合,name是list循环的时候取的一个循环变量.相关指令
item_index:当前变量的索引值
item_has_next:是否存在下一个对象
break:跳出迭代
if指令
<#if (names=="javaschool")>
请访问:www.51gjie.com
</#if>
该标签主要是做if判断用的,要注意的是条件等式必须用括号括起来。
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”>
switch , case , default , break指令
<#switch value>
<#case refValue>...<#break>
<#case refValue>...<#break>
<#default>...
</#switch>
import指令
<#import path as hash>
noparse指令
<#noparse>...</#noparse>
noparse指令指定FreeMarker不处理该指定里包含的内容。
<#noparse>
<#list books as book>
<tr><td>${book.name}<td>作者:${book.author}
</#list>
</#noparse>
escape,noescape指令
<#escape identifier as expression>...
<#noescape>...</#noescape>
</#escape>
escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值。
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指令用于为该模板页面创建或替换一个顶层变量。
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", "51gjie");
// 打印到控制台
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>
你好,51gjie
</body>
</html>
总结
-
FreeMarker是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包,或者说是一个类库。
-
FreeMarker 不是 Web 开发的应用程序框架。它是一个适用于Web应用程序框架中的组件,但是FreeMarker引擎本身并不知道 HTTP协议或 Java Servlet 的存在。它仅仅来生成文本内容。