简介
知识点
字符串
- 转义字符
${r"..."}
: 如:${r"${foo}"}
、${r"C:\foo\bar"}
js_string
用于JavaScript转义,转换'
、"
、换行等特殊字符。如:alert("${errorMessage?js_string}");
${(unsafeStr)!?html}
防止XSS攻击- v2.3.22中
- 出现含有
/
字符的变量无法正常显示,会显示成/
,47为/
的ASCII码- 可已尝试使用
${StringUtil.wrapString(mystr)}
- 可已尝试使用
- 还遇到过
=
字符无法使用split函数分割的问题,可以使用${mystr?split("=")}
试试
- 出现含有
变量
- 参考:https://blog.csdn.net/J080624/article/details/78648786
#assign
指令定义在类freemarker.core.Assignment
中
1 | <!-- 定义变量、ftl提供调用类的静态方法。加?if_exists防止null时报错 --> |
运算符
https://freemarker.apache.org/docs/dgui_template_exp.html#dgui_template_exp_missing_default
??
等同于exists
!
等同于?if_exists
。也可接默认值,如:${(name)!'smalle'}
||
或&&
且- 示例
1 | <!-- ??可用于判断数组是否存在,如果是数组使用!(?if_exists)则报错 --> |
控制语句
1 | <!-- if --> |
其他指令
1 | <#include "include/foo.ftl"><!-- 导入其他ftl文件(相对路径) --> |
数据类型
- 在模板处理时,会将Java类型包装为对应的TemplateModel实现。比如将一个String包装为
SimpleScalar
(对应接口TemplateScalarModel
)来存储同样的值。对于每个Java类型,具体选择什么TemplateModel实现去包装,取决于对象包装器(ObjectWrapper)的实现策略
数组
?split(",")
分割字符串获取数组_index
获取当前循环下标_has_next
判断当前循环元素后面是否还有元素${list[0].name}
通过下标取值- 案例
1 | <!-- 分割字符串获得数组 --> |
Map
1 | <!--创建一个map,注意在freemarker中,map的key只能是字符串来作为key--> |
内置函数
1 | <#if 'Hello, world!'?index_of("world") != -1>包含子字符串</#if> |
配置
- 基本使用
1 | // 1.基本配置 |
自定义指令和自定义函数
- 使用(定义如下文) ^1
1 | <!-- classpath:/test.ftl模板文件 --> |
- 定义如下
1 | public class Main { |
工具类
1 | public class FtlU { |
工具方法
1 | <#-- freemarker 的一些工具方法 --> |
源码解析
1 | // 入口方法:template中可能嵌套了其他模板,但是整体认为是一次渲染 |
参考文章