Freemarker中文参考手册:
http://freemarker.foofun.cn
模版引擎:数据+模版 前端处理模版,后端处理数据
主流模版引擎:
Freemarker:
JSP与Freemarker的区别:
Freemarker需要引用jar包
测试代码:
FreemarkerSample1.java:
package com.imooc.freemarker;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.imooc.freemarker.entity.Computer;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
public class FreemarkerSample1 {
public static void main(String[] args) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
//1. 加载模板
//创建核心配置对象
Configuration config = new Configuration(Configuration.VERSION_2_3_28);
//设置加载的目录,空字符串代表当前包
config.setClassForTemplateLoading(FreemarkerSample1.class, "");
//得到模板对象
Template t = config.getTemplate("sample1.ftl");
//2. 创建数据
Map data = new HashMap();
data.put("site", "新浪");
data.put("url", "http://www.sina.com");
data.put("date", new Date());
data.put("number", 837183.883217);
Map info = new HashMap();
info.put("cpu", "i5");
Computer c1 = new Computer("1234567" , "ThinkPad" , 1 , "李四" , new Date() , 12900f , info);
data.put("computer", c1);
//3. 产生输出
t.process(data, new OutputStreamWriter(System.out));
}
}
simple1.ftl:
<#-- Freemarker取值 -->
${site}
${url}
<#-- !默认值 -->
${author!"不存在的属性"}
<#-- ?string格式化输出 -->
${date?string("yyyy年MM月dd日 HH:mm:ss SSS")}
${number?string("0.00")}
<#if computer.sn == "1234567">
重要设备
#if>
SN:${computer.sn}
型号:${computer.model}
<#if computer.state == 1>
状态:正在使用
<#elseif computer.state == 2>
状态:闲置
<#elseif computer.state == 3>
状态:已作废
#if>
<#switch computer.state>
<#case 1>
状态:正在使用
<#break>
<#case 2>
状态:闲置
<#break>
<#case 3>
状态:已作废
<#break>
<#default>
状态:无效状态
#switch>
<#-- ??代表判断对象是否为空,true不为空,false为空 -->
<#if computer.user??>
用户:${computer.user}
#if>
采购时间:${computer.dop?string("yyyy年MM月dd日")}
采购价格:${computer.price?string("0.00")}
配置信息:
--------------
CPU:${computer.info["cpu"]}
内存:${computer.info["memory"]!"无内存信息"}
输出结果:
新浪
http://www.sina.com
不存在的属性
2019年04月26日 16:56:51 458
837183.88
重要设备
SN:1234567
型号:ThinkPad
状态:正在使用
状态:正在使用
用户:李四
采购时间:2019年04月26日
采购价格:12900.00
配置信息:
--------------
CPU:i5
内存:无内存信息
FTL取值:
分支判断:
list迭代:
测试代码:
FreemarkerSample2.java:
package com.imooc.freemarker;
/**
* 测试迭代
*/
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.imooc.freemarker.entity.Computer;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
public class FreemarkerSample2 {
public static void main(String[] args) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
//1. 加载模板
//创建核心配置对象
Configuration config = new Configuration(Configuration.VERSION_2_3_28);
//设置加载的目录
config.setClassForTemplateLoading(FreemarkerSample2.class, "");
//得到模板对象
Template t = config.getTemplate("sample2.ftl");
//2. 创建数据
Map data = new HashMap();
List computers = new ArrayList();
computers.add(new Computer("1234567" , "ThinkPad X1" , 2 , null , new Date() , 12999f , new HashMap() ));
computers.add(new Computer("1234568" , "HP XXX" , 1 , "张三" , new Date() , 7500f , new HashMap() ));
computers.add(new Computer("1234569" , "DELL XXX" , 3 , "李四" , new Date() , 8500f , new HashMap() ));
computers.add(new Computer("1234570" , "ACER XXX" , 1 , "王五" , new Date() , 6300f , new HashMap() ));
computers.add(new Computer("1234571" , "MSI XXX" , 1 , "赵六" , new Date() , 9300f , new HashMap() ));
data.put("computers", computers);
//LinkedHashMap可以保证数据按存放顺序进行提取
Map computerMap = new LinkedHashMap();
for(Computer c : computers) {
computerMap.put(c.getSn(), c);
}
data.put("computer_map", computerMap);
//3. 产生输出
t.process(data, new OutputStreamWriter(System.out));
}
}
simple2.ftl:
<#list computers as c>
序号:${c_index + 1} <#-- 迭代变量_index保存了循环的索引,从0开始 -->
SN:${c.sn}
型号:${c.model}
<#switch c.state>
<#case 1>
状态:使用中
<#break>
<#case 2>
状态:闲置
<#break>
<#case 3>
状态:已作废
<#break>
#switch>
<#if c.user??>
用户:${c.user}
#if>
采购日期:${c.dop?string("yyyy-MM-dd")}
采购价格:${c.price?string("0.00")}
-------------------------------------------
#list>
==========================================
<#list computer_map?keys as k >
${k}-${computer_map[k].model}
${computer_map[k].price?string("0.00")}
#list>
输出结果:
序号:1
SN:1234567
型号:ThinkPad X1
状态:闲置
采购日期:2019-04-26
采购价格:12999.00
-------------------------------------------
序号:2
SN:1234568
型号:HP XXX
状态:使用中
用户:张三
采购日期:2019-04-26
采购价格:7500.00
-------------------------------------------
序号:3
SN:1234569
型号:DELL XXX
状态:已作废
用户:李四
采购日期:2019-04-26
采购价格:8500.00
-------------------------------------------
序号:4
SN:1234570
型号:ACER XXX
状态:使用中
用户:王五
采购日期:2019-04-26
采购价格:6300.00
-------------------------------------------
序号:5
SN:1234571
型号:MSI XXX
状态:使用中
用户:赵六
采购日期:2019-04-26
采购价格:9300.00
-------------------------------------------
==========================================
1234567-ThinkPad X1
12999.00
1234568-HP XXX
7500.00
1234569-DELL XXX
8500.00
1234570-ACER XXX
6300.00
1234571-MSI XXX
9300.00
Freemarker内置函数:
测试代码:
FreemarkerSample3.java:
package com.imooc.freemarker;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.imooc.freemarker.entity.Computer;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
public class FreemarkerSample3 {
public static void main(String[] args) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
//1. 加载模板
//创建核心配置对象
Configuration config = new Configuration(Configuration.VERSION_2_3_28);
//设置加载的目录
config.setClassForTemplateLoading(FreemarkerSample3.class, "");
//得到模板对象
Template t = config.getTemplate("sample3.ftl");
//2. 创建数据
Map data = new HashMap();
data.put("name", "jackson");
data.put("brand", "bmw");
data.put("words", "first blood");
data.put("n", 37981.83);
data.put("date", new Date());
List computers = new ArrayList();
computers.add(new Computer("1234567" , "ThinkPad X1" , 2 , null , new Date() , 12999f , new HashMap() ));
computers.add(new Computer("1234568" , "HP XXX" , 1 , "张三" , new Date() , 7500f , new HashMap() ));
computers.add(new Computer("1234569" , "DELL XXX" , 3 , "李四" , new Date() , 8500f , new HashMap() ));
computers.add(new Computer("1234570" , "ACER XXX" , 1 , "王五" , new Date() , 6300f , new HashMap() ));
computers.add(new Computer("1234571" , "MSI XXX" , 1 , "赵六" , new Date() , 9300f , new HashMap() ));
data.put("computers", computers);
//3. 产生输出
t.process(data, new OutputStreamWriter(System.out));
}
}
sample3.ftl:
${name?cap_first}
${brand?upper_case}
${brand?length}
${words?replace("blood" , "*****")}
${words?index_of("blood")}
<#-- 利用?string实现三目运算符的操作 -->
<#-- 判断是否是否包含,利用三目运算 -->
${(words?index_of("blood") != -1)?string("包含敏感词汇","不包含敏感词汇")}
${n?round}
${n?floor}
${n?ceiling}
公司共有${computers?size}台电脑
第一台:${computers?first.model}
最后一台:${computers?last.model}
<#list computers?sort_by("price")?reverse as c>
${c.sn}-${c.price}
#list>
输出结果:
Jackson
BMW
3
first *****
6
包含敏感词汇
37,982
37,981
37,982
公司共有5台电脑
第一台:ThinkPad X1
最后一台:MSI XXX
1234567-12,999
1234571-9,300
1234569-8,500
1234568-7,500
1234570-6,300
案例:Freemarker与Servlet整合
github地址:
https://github.com/ChuanshuaiLi/Freemarker.git