一 写一个简单的入门demo##
1.创建一个mavenProject-jar######
在pom.xml中引入依赖
<dependencies>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
</dependencies>
2.设置静态模板,放入src/main/resources,后缀名一般使用"ftl"######
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
${name},你好,${message}
</body>
</html>
3.设置数据源.src/main/java/com/mydemo/freeMakerDemo######
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<String,String> map = new HashMap<String, String>();
map.put("name", "张三");
map.put("message", "欢迎使用freemaker");
/**
* 6.设置输出位置,以IO流的形式输出,jutidao文件
*/
Writer writer = new FileWriter("E:\\developTemps\\test.html");
/**
* 输出
*/
template.process(map, writer);
/**
* 关闭流
*/
writer.close();
}
}
二 指令
语法:<#指令名 参数>
1.注释######
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<#--这是freemark的注释-->
<!-- 这是html的注释,两者的区别是这个注释会出现在生成的模板中,并且f12能看到,freemaker的注释指令在生成的页面中不显示-->
${name},你好,${message}
</body>
</html>
生成的静态页
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
张三,你好,欢迎使用freemaker
</body>
</html>
2.assign指令######
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!-- assign指令写在静态模板中,作用为制定数据源,assign指定的数据源在java代码的数据源中可以不定义 -->
<!-- 定义简单数据类型 -->
<#assign linkMan="张三"><br>
${linkMan}
<hr>
<!-- 定义简单对象类型 -->
<#assign people={"name":"张三","address":"成都xxxxx","phone":"182xxxxxxxx"}>
${people.name}<br>
${people.address}<br>
${people.phone}<br>
</body>
</html>
生成的静态页
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!-- assign指令写在静态模板中,作用为制定数据源,assign指定的数据源在java代码的数据源中可以不定义 -->
<!-- 定义简单数据类型 -->
<br>
张三
<hr>
<!-- 定义简单对象类型 -->
张三<br>
成都xxxxx<br>
182xxxxxxxx<br>
</body>
</html>
3.include指令######
静态模板代码
– test.ftl
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!-- include指令可以包含另一个页面 -->
<#include "head.ftl">
<br>
<#-- 指令 assign-->
<#assign linkMan="张三">
${linkMan}
</body>
</html>
head.ftl
<strong>欢迎使用freemark</h1>
生成的静态页面
<html>
<head>
<meta charset="utf-8">
<title>效果图</title>
</head>
<body>
<!-- include指令可以包含另一个页面 -->
<strong>欢迎使用freemark</strong>
<br>
张三
</body>
</html>
4.if指令######
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!-- success == true -->
<#assign success1=true>
<#if success1=true>
通过
<#else>
未通过
</#if>
<hr>
<!--success == false-->
<#assign success2=false>
<#if success2=true>
通过
<#else>
未通过
</#if>
</body>
</html>
生成页面代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!-- success == true -->
通过
<hr>
<!--success == false-->
未通过
</body>
</html>
5.list指令######
数据源(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<String,Object> goods1=new HashMap<String,Object>();
goods1.put("name", "苹果");
goods1.put("price", 5.8);
// 商品2
Map<String,Object> goods2=new HashMap<String,Object>();
goods2.put("name", "香蕉");
goods2.put("price", 2.5);
// 商品3
Map<String,Object> goods3=new HashMap<String,Object>();
goods3.put("name", "橘子");
goods3.put("price", 3.2);
// 封装list
List<Map<String,Object>> goodsList=new ArrayList<Map<String,Object>>();
goodsList.add(goods1);
goodsList.add(goods2);
goodsList.add(goods3);
// 封装map
Map<String,List<Map<String,Object>>> map = new HashMap<String, List<Map<String,Object>>>();
map.put("goodsList", goodsList);
// 设置输出流
Writer writer = new FileWriter("E:\\developTemps\\test.html");
// 生成静态代码
template.process(map, writer);
// 关闭流
writer.close();
}
}
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<#list goodsList as goods>
商品名称:${goods.name} || 商品价格:${goods.price}
<br>
</#list>
</body>
</html>
生成页面代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
商品名称:苹果 || 商品价格:5.8
<br>
商品名称:香蕉 || 商品价格:2.5
<br>
商品名称:橘子 || 商品价格:3.2
<br>
</body>
</html>
ps:获取列表下表:_index
<#list goodsList as goods>
商品名称:${goods.name} || 商品价格:${goods.price}
<br>
</#list>
三 内置函数
语法:${对象?内置函数名}
1.获取集合长度 ?size
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<#list goodsList as goods>
商品名称:${goods.name} || 商品价格:${goods.price}
<br>
</#list>
<br>
本页面一共有<strong>${goodsList?size}</strong>条数据
</body>
</html>
生成页面代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
商品名称:苹果 || 商品价格:5.8
<br>
商品名称:香蕉 || 商品价格:2.5
<br>
商品名称:橘子 || 商品价格:3.2
<br>
<br>
本页面一共有<strong>3</strong>条数据
</body>
</html>
2.将json字符串转换为json######
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<#assign people="{'name':'张三','address':'成都xxxxx','phone':'182xxxxxxxx'}">
<#assign data=people?eval>
姓名:${data.name}<br>
地址:${data.address}<br>
电话:${data.phone}<br>
</body>
</html>
生成页面代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
姓名:张三<br>
地址:成都xxxxx<br>
电话:182xxxxxxxx<br>
</body>
</html>
3.日期格式化
数据源(java)代码
map.put("time",new Date());
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
当前日期:${time?date}<br>
当前时间:${time?time}<br>
当前日期+时间:${time?datetime}<br>
日期格式化:${time?string("yyyy年MM月dd日 HH时mm分ss秒")}
</body>
</html>
生成页面代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
当前日期:2018-3-3<br>
当前时间:16:42:09<br>
当前日期+时间:2018-3-3 16:42:09<br>
日期格式化:2018年03月03日 16时42分09秒
</body>
</html>
4.数字格式化(去掉数字的,) ?c######
ps:在freemaker中,数字超过三位会自动加逗号,去掉逗号需要使用${number?c}指令
数据源(java)代码
map.put("num",1312545)
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
${point?c}
</body>
</html>
生成静态页面
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
12548524
</body>
</html>
四 空值处理
在写模板时,有时候我们不知道某个变量是否会赋值,这时候我们需要对变量进行处理,以防止如果该变量为空造成的程序终止
静态模板代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!-- 方法一:使用if判断 ??为判断变量是否存在 -->
<#if aaa??>
变量存在
<#else>
变量不存在
</#if>
<hr>
<!-- 方法二:${变量!""} "这里面写如果变量不存在使用什么代替" -->
${bbb!"变量不存在"}
</body>
</html>
生成的静态页面
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!-- 方法一:使用if判断 ??为判断变量是否存在 -->
变量不存在
<hr>
<!-- 方法二: "这里面写如果变量不存在使用什么代替" -->
变量不存在
</body>
</html>
五 其他
1.关于<#if>判断中使用比较运算符报错的问题######
错误代码
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<#if number>100>
大于100
</#if>
</body>
</html>
原因:freemaker将"<#if number>100>“分解为了”<#if number>" 和"100>"两部分,判断无法进行
解决办法:将"number>100"用括号包起来 或者使用"gt"(大于),“gte”(大等),“lt”(小于),“lte”(小等)代替
<html>
<head>
<meta charset="utf-8">
<title>FreemarkeDemo</title>
</head>
<body>
<!--方法一-->
<#if (number>100)>
大于100
</#if>
<hr>
<!--方法二-->
<#if numbergt 100>
大于100
</#if>
</body>
</html>