1. FTL 指令
1.1 assign 指令
(1)定义简单类型:
<#assign linkman="周先生">
联系人:${linkman}
(2)定义对象类型:
<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
电话:${info.mobile} 地址:${info.address}
1.2 include 指令
此指令用于模板文件的嵌套
- 创建模板文件 head.ftl
<h1>信息网</h1>
- 我们修改 test.ftl,在模板文件中使用 include 指令引入刚才我们建立的模板
<#include "head.ftl">
1.3 if 指令
<#if flag=1>
<div style="height: 100px;width:100px; background-color: blue;">
蓝色方块
</div>
<#elseif flag=2>
<div style="height: 100px;width:100px; background-color: red;">
红色方块
</div>
<#else>
<div style="height: 100px;width:100px; background-color: black;">
黑色方块
</div>
</#if>
1.4 list 指令
- list 集合
----商品价格表----<br>
<#list goodsList as goods>
${goods_index+1} 商品名称: ${goods.name} 价格:${goods.price}<br>
</#list>
如果想在循环中得到索引,使用循环变量
*_index
就可以得到, 如:goods_index
- Map集合
<#assign score = {"语文":78,"数学":83,"Java":89} >
<#list score?key as x>
${x}--->${score[x]};
</#list>
2. 内建函数
2.1 获取集合大小
- 我们使用 size 函数来实现,代码如下:
<!-- goodsList为商品列表集合-->
共 ${goodsList?size} 条记录
2.2 转换 JSON 字符串为对象
- eval
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}
2.3 日期格式化
- 代码中对变量赋值:
dataModel.put("today", new Date());
- 在模板文件中加入
当前日期:${today?date} <br>
当前时间:${today?time} <br>
当前日期+时间:${today?datetime} <br>
日期格式化: ${today?string("yyyy 年 MM 月")}
- 运行效果如下:
2.4 数字转换为字符串
- 代码中对变量赋值:
map.put("point", 102920122);
- 修改模板:
累计积分:${point}
- 页面显示如下 :
我们会发现数字会以每三位一个分隔符显示,有些时候我们不需要这个分隔符,就需要将数字转换为字符串,使用内建函数
c
累计积分:${point?c}
- 页面显示效果如下:
3. 空值处理运算符
3.1 判断某变量是否存在: “??
”
- 用法为:
variable??
,如果该变量存在,返回 true,否则返回 false
<#if aaa??>
aaa 变量存在
<#else>
aaa 变量不存在
</#if>
3.2 缺失变量默认值: “!
”
我们除了可以判断是否为空值,也可以使用!对 null 值做转换处理
- 在模板文件中加入
${aaa!'defaultValue'}
- 在代码中不对 aaa 赋值,也不会报错了 ,当 aaa 为 null 则返回
!
后边的内容defaultValue
!
后面也可以什么都不写, 如果 aaa 为 null , 则返回空字符串""
4. 运算符
4.1 算数运算符
FreeMarker 表达式中完全支持算术运算,
FreeMarker 支持的算术运算符包括: + , - , * , / , %
4.2 逻辑运算符
逻辑运算符有如下几个:
逻辑与: &&
逻辑或: ||
逻辑非: !
逻辑运算符只能作用于布尔值,否则将产生错误
4.3 比较运算符
表达式中支持的比较运算符有如下几个:
1 =或者==:判断两个值是否相等.
2 !=:判断两个值是否不等.
3 >或者 gt:判断左边值是否大于右边值
4 >=或者 gte:判断左边值是否大于等于右边值
5 <或者 lt:判断左边值是否小于右边值
6 <=或者 lte:判断左边值是否小于等于右边值
注意
:=
和!=
可以用于字符串,数值和日期来比较是否相等,但=
和!=
两边必须是相同类型的值,否则会产生错误,而且 FreeMarker 是精确比较,"x"
,"x "
,"X"
是不等的.- 其它的运算符可以作用于数字和日期,但不能作用于字符串
- 大部分的时候,使用
gt
等字母运算符代替>
会有更好的效果,因为 FreeMarker 会把>
解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>
5. Freemarker 工具类
用于生成生成静态页面
5.1 引入 maven 坐标
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
5.2 创建配置文件
- 在
src/main/resource/properties
目录下创建freemarker.properties
文件
# 模板所在的包路径 (相对路径)
templateRelativePath=/com/freemarker/ftl
# Html页面输出的包路径(绝对路径)
absolutePath=G:\\freemarker\\ftl-out
注:
在融入spring架构时要在xml
配置文件中使用
<context:property-placeholder location="classpath*:properties/*.properties" />
加载freemarker.properties
文件, 用@Value
注解注入 , 如下:
@Value("${templateRelativePath}")
private String templateRelativePath;
@Value("${absolutePath}")
private String absolutePath;
5.3 创建模板文件
模板文件中四种元素
1、文本,直接输出的部分
2、注释,即<#--...-->
格式不会输出
3、插值(Interpolation):即${..}
部分, 将使用数据模型中的部分替代输出
4、FTL 指令:FreeMarker 指令,和 HTML 标记类似,名字前加#
予以区分,不会输出。
5.4 freemarker工具类
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.*;
import java.util.Map;
/**
* freemarker工具类 : 用于生成生成静态页面
*/
public class FMUtils {
// 模板所在的包路径(类路径下的相对路径)
private String templateRelativePath;
// Html页面输出的包路径(绝对路径)
private String absolutePath;
public FMUtils(String templateRelativePath, String absolutePath) {
this.templateRelativePath = templateRelativePath;
this.absolutePath = absolutePath;
}
/**
* @param ftlName :模板名字
* @param fileName :生成的html的名字
* @param map :数据, 在freemarker模板中取数据都使用map
*/
public void ouputFile(String ftlName, String fileName, Map<String, Object> map) throws Exception {
// 创建fm的配置
Configuration config = new Configuration(Configuration.getVersion());
// 指定默认编码格式
config.setDefaultEncoding("UTF-8");
// 设置模板的包路径 /com/pyg/ftl
config.setClassForTemplateLoading(this.getClass(), templateRelativePath);
// 获得包的模板
Template template = config.getTemplate(ftlName);
// 创建输出文档对象
File file = new File(absolutePath + "/" + fileName);
// 定义输出流,注意的必须指定编码
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file), "utf-8"));
// 生成模板
template.process(map, out);
/*
//同时把生成html页面上传到静态页面服务器
//连接linux服务
//参数 1: 服务器IP地址, 2: SSH服务端口, 3: 用户名, 4: 密码
//建议参数放在配置文件中
ChannelSftp channelSftp = SftpUtil.connect("192.168.12.11", 22, "root", "1111");
//上传
InputStream in = new FileInputStream(file);
SftpUtil.upload("/data/images", in, fileName, channelSftp);
*/
//关闭
out.close();
}
}
注
: 若需要同时把生成html页面上传到静态页面服务器, 则取消/*...*/
注释即可