Freemarker:是一款模板引擎,不是web框架。
本例java文件:
import java.io.File;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class Test1 {
public static void main(String[] args) throws Exception {
//创建freemarker配置实例
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("templates"));
//创建数据模型
Map root = new HashMap<>();
root.put("user", "sy");
root.put("random", new Random().nextInt(100));
List list = new ArrayList<>();
list.add(new Address("中国", "北京"));
list.add(new Address("英国", "伦敦"));
list.add(new Address("美国", "纽约"));
root.put("lst", list);
root.put("date1", new Date());
root.put("htm2", "<b>粗体</b>");
//加载模板文件
Template t1 = cfg.getTemplate("a.ftl");
//显示生成的数据
Writer out = new OutputStreamWriter(System.out);
t1.process(root, out); //加载root数据并输出
out.flush();
out.close();
}
}
数据类型:
一:直接指定值
1、字符串:字符串值使用单引号或双引号限定。
<#assign c="sss" /> <#-- assign是定义变量 -->
2、数值:可直接输入,不需引号
<#assign b=123 />
3、布尔值:true或false,不使用引号
<#assign a=true /> <#-- assign是定义变量 -->
4、集合:集合用中括号包括,集合元素间用逗号分隔。使用数字范围也可表示数字集合,如1..5等同于[1,2,3,4,5]; 5..1表示[5,4,3,2,1]
5、Map对象:Map对象使用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔。(key必须是字符串)
6、时间对象:
//创建数据模型
Map root = new HashMap<>();
root.put("date1", new Date());
${date1?string("yyyy-MM-dd HH:mm:ss")}
<#-- 输出:2017-04-12 16:16:37 -->
7、javabean的处理:同EL表达式一样,类型可自动转化
二:输出变量值:使用点(.)语法来访问java对象的属性
1、顶层变量:即直接放在数据模型中的值,输出用${name}即可。
Map root = new HashMap<>();
root.put("user", "sy");
你好,${user},今天你的精神不错! <#--输出:你好,sy,今天你的精神不错!-->
2、输出集合元素:根据集合元素的索引输出集合元素,索引用中括号包括。如:输出[“1”,”2”,”3”]这个集合number,可用${number[0]}输出第一个数字,还可用number[1..2]表示原集合的子集合[“2”,”3”]
3、输出Map元素:对于javabean,如下几种写法效果一致:
book.author.name
book.author["name"]
book["author"].name
book["author"]["name"]
三、字符串操作:
1、字符串连接,下两种写法等效:
${"Hello,${user}"}
${"hello,"+user+"!"}
2、截取字串:根据字符串索引进行
<#assign number="01234">
${number[0]} <#-- 输出字符0 -->
${number[0..3]} <#-- 输出字串0123 -->
四:集合连接操作:运算符”+”
五、Map连接操作:运算符”+”
六、算术运算符:“+”“-””*”“/”“%”
七:比较运算符
1、=(或==):判断两个值是否相等
2、!=:判断两值是否不相等
3、>(或gt) :大于
4、>=(或gte):大于等于
5、<(或lt): 小于
6、<=(或lte):小于等于
八、逻辑运算符:
1、&&:逻辑与
2、||:逻辑或
3、!:逻辑非
九、内建函数:
1、html:对字符串进行HTML编码
2、cap_irst:是字符串第一个字母大写
3、lower_case:将字符串转成小写
4、upper_case:将字符串转成大写
5、size:获取集合中元素个数
6、int:获取数字的整数部分
Map root = new HashMap<>();
root.put("htm2", "<b>粗体</b>");
${htm2?html}
<#--输出:<b>粗体</b>-->
十、空值处理空值:freemarker变量必须赋值,否则会抛异常。freemarker提供两个运算符来避免空值:
1、!:指定缺失变量的默认值
<#-- ${sss} 没有定义这个变量,会报异常 -->
${sss!} <#-- 没有定义这个变量,默认值是空字符串 -->
${sss!"abc"} <#-- 没有定义这个变量,默认值是字符串abc -->
<#--输出:
abc-->
2、??:判断变量是否存在,存在返回true,否则返回false
<#if myname??><h1>Welcome ${myname}</h1></#if>
模板开发语句:
一、if指令:
单判断:
<#if user=="sy">
哈哈!
</#if> <#-- 输出:哈哈! -->
双判断:
root.put("random", new Random().nextInt(100));
<#if random gte 60> <#-- random>=60 -->
及格
<#else>
不及格
</#if>
多重判断:
<#if random gte 90>
优秀!
<#elseif random gte 80>
良好!
<#else>
一般!
</#if>
二、list指令:
Map root = new HashMap<>();
List list = new ArrayList<>();
list.add(new Address("中国", "北京"));
list.add(new Address("英国", "伦敦"));
list.add(new Address("美国", "纽约"));
root.put("lst", list);
<#list lst as dizhi>
<b>${dizhi.country}</b> <br/>
</#list>
<#-- 输出: <b>中国</b> <br/>
<b>英国</b> <br/>
<b>美国</b> <br/> -->
三、include指令:
included.txt:
我是被包含的文件的内容!!!
a.ftl:
<#include "included.txt" />
<#-- 输出included.txt内容:我是被包含的文件的内容!!! -->
四、自定义指令(macro指令(宏指令)):
定义宏:
<#macro m1> <#--定义指令m1-->
<b>aaabbbccc</b>
<b>dddeeefff</b>
</#macro>
定义带参的宏:
<#macro m2 a b c>
${a}--${b}--${c}
</#macro>
nested指令(嵌入指令):
<#macro border>
<table border=4 cellspacing=0 cellpadding=4>
<tr>
<td>
<#nested>
</td>
</tr>
</table>
</#macro>
调用宏:
<@m1 /> <@m1 /> <@m1 /> <#--调用三次m1,输出三次:<b>aaabbbccc</b>
<b>dddeeefff</b> -->
<@m2 "hi" "nihao" "hello" /> <#-- 输出:hi--nihao--hello-->
<@m2 "s" "ss" "sss" /> <#-- 输出:s--ss--sss -->
<@border>
sdasdsadjkskj;;sdkasdkksaj
</@border>
<#-- 输出:
<table border=4 cellspacing=0 cellpadding=4>
<tr>
<td>
sdasdsadjkskj;;sdkasdkksaj
</td>
</tr>
</table>
-->
五、命名空间namespace:
路径不应包含大写字母,为了分隔词语,使用下划线。
b.ftl:
<#macro copyright date>
<p>Copyright ${date} sy.</p>
</#macro>
<#assign mail="sy@1.com">
a.ftl:
<#import "b.ftl" as bb />
<@bb.copyright date="2017.4.12" />
${bb.mail}
<#assign mail="my@1.com" />
${mail}
<#assign mail="my@1.com" in bb />
${bb.mail}
<#--输出:
<p>Copyright 2017.4.12 sy.</p>
sy@1.com
my@1.com
my@1.com
-->