在pom.xml中引入依赖
org.freemarker
freemarker
2.3.23
FreemarkeDemo
${name},你好,${message}
package com.mydemo.freeMakerDemo;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class Test {
public static void main(String[] args) throws Exception {
/**
* 1.创建配置对象
* 需要注意的是:
* new Configuration需要传入参数,参数为freeMaker版本号
* Configuration有静态方法getVersion()获取版本号
*/
Configuration configuration = new Configuration(Configuration.getVersion());
/**
* 2.设置模板所在目录
* 需要注意的是:
* setDirectoryForTemplateLoading中的参数是一个File
* File的参数精确到文件夹
* 与之相反的是后面的输出流对象则是一个文件
*/
configuration.setDirectoryForTemplateLoading(new File("E:\\develop\\eclipse1.7\\freemaker-Demo\\src\\main\\resources"));
/**
* 3.设置字符集
* 非必要,与步骤2位置可以互换
* 需要注意的是:
* workspace的字符集也必须更换到utf-8,否则生成的静态页面会有乱码
*/
configuration.setDefaultEncoding("utf-8");
/**
* 4.获取模板对象,参数String,值随意
*/
Template template = configuration.getTemplate("test.ftl");
/**
* 5.设置数据源
* 需要注意的是:
* 数据源可以是pojo,也可以是Map,但Map更加灵活
* 并且,模板中如果有标记,则数据源中必须有对应的数据,否则报错
*/
Map map = new HashMap();
map.put("name", "张三");
map.put("message", "欢迎使用freemaker");
/**
* 6.设置输出位置,以IO流的形式输出,jutidao文件
*/
Writer writer = new FileWriter("E:\\developTemps\\test.html");
/**
* 输出
*/
template.process(map, writer);
/**
* 关闭流
*/
writer.close();
}
}
语法:<#指令名 参数>
静态模板代码
FreemarkeDemo
<#--这是freemark的注释-->
${name},你好,${message}
生成的静态页
FreemarkeDemo
张三,你好,欢迎使用freemaker
静态模板代码
FreemarkeDemo
<#assign linkMan="张三">
${linkMan}
<#assign people={"name":"张三","address":"成都xxxxx","phone":"182xxxxxxxx"}>
${people.name}
${people.address}
${people.phone}
生成的静态页
FreemarkeDemo
张三
张三
成都xxxxx
182xxxxxxxx
静态模板代码
– test.ftl
FreemarkeDemo
<#include "head.ftl">
<#-- 指令 assign-->
<#assign linkMan="张三">
${linkMan}
head.ftl
欢迎使用freemark
生成的静态页面
效果图
欢迎使用freemark
张三
静态模板代码
FreemarkeDemo
<#assign success1=true>
<#if success1=true>
通过
<#else>
未通过
#if>
<#assign success2=false>
<#if success2=true>
通过
<#else>
未通过
#if>
生成页面代码
FreemarkeDemo
通过
未通过
数据源(java)代码
package cn.itcast.freemakerDemo;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class Test {
public static void main(String[] args) throws Exception {
// 创建配置对象
Configuration configuration = new Configuration(Configuration.getVersion());
// 设置模板目录
configuration.setDirectoryForTemplateLoading(new File("E:\\develop\\eclipse1.7\\freemaker-Demo\\src\\main\\resources"));
// 指定字符集
configuration.setDefaultEncoding("utf-8");
// 获取模板对象
Template template = configuration.getTemplate("test.ftl");
// 设置数据源
// 商品1
Map goods1=new HashMap();
goods1.put("name", "苹果");
goods1.put("price", 5.8);
// 商品2
Map goods2=new HashMap();
goods2.put("name", "香蕉");
goods2.put("price", 2.5);
// 商品3
Map goods3=new HashMap();
goods3.put("name", "橘子");
goods3.put("price", 3.2);
// 封装list
List
静态模板代码
FreemarkeDemo
<#list goodsList as goods>
商品名称:${goods.name} || 商品价格:${goods.price}
#list>
生成页面代码
FreemarkeDemo
商品名称:苹果 || 商品价格:5.8
商品名称:香蕉 || 商品价格:2.5
商品名称:橘子 || 商品价格:3.2
ps:获取列表下表:_index
<#list goodsList as goods>
商品名称:${goods.name} || 商品价格:${goods.price}
#list>
语法:${对象?内置函数名}
静态模板代码
FreemarkeDemo
<#list goodsList as goods>
商品名称:${goods.name} || 商品价格:${goods.price}
#list>
本页面一共有${goodsList?size}条数据
生成页面代码
FreemarkeDemo
商品名称:苹果 || 商品价格:5.8
商品名称:香蕉 || 商品价格:2.5
商品名称:橘子 || 商品价格:3.2
本页面一共有3条数据
静态模板代码
FreemarkeDemo
<#assign people="{'name':'张三','address':'成都xxxxx','phone':'182xxxxxxxx'}">
<#assign data=people?eval>
姓名:${data.name}
地址:${data.address}
电话:${data.phone}
生成页面代码
FreemarkeDemo
姓名:张三
地址:成都xxxxx
电话:182xxxxxxxx
数据源(java)代码
map.put("time",new Date());
静态模板代码
FreemarkeDemo
当前日期:${time?date}
当前时间:${time?time}
当前日期+时间:${time?datetime}
日期格式化:${time?string("yyyy年MM月dd日 HH时mm分ss秒")}
生成页面代码
FreemarkeDemo
当前日期:2018-3-3
当前时间:16:42:09
当前日期+时间:2018-3-3 16:42:09
日期格式化:2018年03月03日 16时42分09秒
ps:在freemaker中,数字超过三位会自动加逗号,去掉逗号需要使用${number?c}指令
数据源(java)代码
map.put("num",1312545)
静态模板代码
FreemarkeDemo
${point?c}
生成静态页面
FreemarkeDemo
12548524
在写模板时,有时候我们不知道某个变量是否会赋值,这时候我们需要对变量进行处理,以防止如果该变量为空造成的程序终止
静态模板代码
FreemarkeDemo
<#if aaa??>
变量存在
<#else>
变量不存在
#if>
${bbb!"变量不存在"}
生成的静态页面
FreemarkeDemo
变量不存在
变量不存在
错误代码
FreemarkeDemo
<#if number>100>
大于100
#if>
原因:freemaker将"<#if number>100>“分解为了”<#if number>" 和"100>"两部分,判断无法进行
解决办法:将"number>100"用括号包起来 或者使用"gt"(大于),“gte”(大等),“lt”(小于),“lte”(小等)代替
FreemarkeDemo
<#if (number>100)>
大于100
#if>
<#if numbergt 100>
大于100
#if>