跳至主要內容

Freemarker

chanchaw大约 3 分钟languagejava

基础语法

插值表达式

语法 ${...} 的花括号中间填写变量名称

freemarker指令

freemarker标签以#开头,自定义的以@开头

注释

注释:<#-- 这里写注释的内容 -->

分支 - if

下面代码中 flag 是后端传递给 freemarker 的 map 中的一个属性

<#if flag=1>
    第一种情况
    <#elseif flag=2>
    第二种情况
    <#else>
    第三种情况
</#if>

循环 - list

as 表示将 list 集合中的每个元素遍历中都命名为 weekday,所以内部使用插值表达式显示出来 索引:按照下面的代码则索引是 - ${weekday_index} 判断是否有下一个元素:${weekday_has_next}

<#list weeks as weekday>
  ${weekday}
</#list>

包含 - include

可以将其他 ftl 模板包含到当前模板文件中

<#include "template02.ftl">

声明变量 - assign

在模板文件中声明变量并加入模板数据的 map 对象中,之后可以使用该变量

<#assign name="zhangsan">
  ${name}

下面代码是将后端服务传递来的属性数据通过内置函数转换后赋值给自定义的变量: 将属性 ClassName 通过内置函数 uncap_first 将首字母转换为小写后赋值给自定义属性 classNameLower

<#assign classNameLower = ClassName ? uncap_first>

内置函数

<#-- 属性名称 username 后面的 ?lower_case 表示将字符串显示为小写 -->
${username?lower_case}
<#-- 类似的函数还有: 
?html - html字符转义
?lower_case - 字符串小写
?upper_case - 字符串大写
?trim - 去掉字符串首尾的空格
?substring - 截取字符串
?length - 去字符串长度
?size - 序列中元素的个数
?int - 数字的整数部分
?cap_first,首字母大写,使用案例:
${table.modelClassName?cap_first}
-->
?uncap_first - 首字母小写

// 下面是日期时间相关内置函数
获取当前系统时间
${.now} 是获取当前系统时间年月日时分秒 yyyy-MM-dd HH:mm:ss格式。
${.now?datetime}跟直接用${.now}一样,都是直接获取年月日时分秒。
${.now?date}是获取当前时间年月日  yyyy-MM-dd格式。
${.now?time}是获取当前时间的时分秒 HH:mm:ss格式
也可以截取时间
${'2018-12-26 10:32:40'?date} 输出:2018-12-26

  
// 判断空,在 if 标签内部不需要使用 $,两个标签中间要使用
// 下面代码表示不为空的时候打印备用
<#if remarks??>${remarks}</#if>
    
// 小数点相关
<#assign allPages = 一个浮点数 ? ceiling/>
round:返回最近的整数。 如果数字以.5结尾,那么它将进位(也就是向正无穷方向进位)
floor:返回数字的舍掉小数后的整数 (也就是向负无穷舍弃)
ceiling:返回数字小数进位后的整数 (也就是向正无穷进位)

案例

第一个最简单

@Test
public void testFile() throws IOException, TemplateException {
    // 1. 创建配置对象
    Configuration cfg = new Configuration();
    // 2. 指定模板加载器。指定和 src 同级别有名称为 templates 的目录作为模板文件的存放目录
    FileTemplateLoader ftl = new FileTemplateLoader(new File("templates"));
    cfg.setTemplateLoader(ftl);
    // 3. 获取模板。与src同级别的名称为 templates 的目录下有文件 template01.ftl
    Template template = cfg.getTemplate("template01.ftl");
    // 4. 构造数据模型。模板文件 template01.ftl 的内容是:欢迎:${username}
    //     后面的 ${} 是插值表达式,其中的 username 表示 ftlData 的键
    Map<String,Object> ftlData = new HashMap<>();
    ftlData.put("username","chanchaw");
    // 5. 输出文件
    //template.process(ftlData,new FileWriter(new File("D:\\software\\codegenerator\\doc\\a.txt")));
    // 输出到控制台
    template.process(ftlData,new PrintWriter(System.out));
}