文本替换
- 直接替换内存中的字符串, 可动态设置通知内容
@Test
public void templateTest() {
Map<String, Object> model = Maps.newHashMap();
model.put("季节", "春");
model.put("花名", "桃花");
model.put("作者", "李白");
String sourceCode = "${季节}夜宴从弟${花名}园序\n" +
"${作者}〔唐代〕\n" +
" 夫天地者万物之逆旅也;光阴者百代之过客也。而浮生若梦,为欢几何?\n" +
"古人秉烛夜游,良有以也。况阳${季节}召我以烟景,大块假我以文章。\n" +
"会${花名}之芳园,序天伦之乐事。\n" +
"群季俊秀,皆为惠连;吾人咏歌,独惭康乐。\n" +
"幽赏未已,高谈转清。开琼筵以坐花,飞羽觞而醉月。\n" +
"不有佳咏,何伸雅怀?如诗不成,罚依金谷酒数。";
try (StringWriter out = new StringWriter()){
Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
Template template = new Template("我是一个可爱的模板名称", sourceCode, configuration);
template.process(model, out);
System.out.println(out.toString());
} catch (TemplateException e) {
System.out.printf("${%s}设置有误,请检查", e.getBlamedExpressionString());
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
- 读取模板文件生成新的文件, 可用于实现自动生成代码
@Test
public void templateFileTest() {
// 项目路径
String projectPath = new File("").getAbsolutePath();
try {
// 1.创建一个Configuration对象,直接new一个对象。构造方法的参数就是FreeMarker对于的版本号。
Configuration configuration = new Configuration(Configuration.getVersion());
// 2.设置模板文件所在的路径。
configuration.setDirectoryForTemplateLoading(new File(projectPath + "/ftls/source"));
// 3.设置模板文件使用的字符集。一般就是utf-8.
configuration.setDefaultEncoding("utf-8");
// 5.加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate("hello.ftl");
// 6.创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("hello", "我想输出一种能量");
// 7.创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out = new FileWriter(new File(projectPath + "/ftls/target/" + template.getSourceName().replace(".ftl", ".txt")));
// 8.调用模板对象的process方法输出文件。
template.process(dataModel, out);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
System.out.printf("${%s}设置有误,请检查", e.getBlamedExpressionString());
e.printStackTrace();
}
}
maven依赖
<dependency>
<groupId>org.FreeMarker</groupId>
<artifactId>FreeMarker</artifactId>
<version>2.3.29</version>
</dependency>
常用语法
定义变量
<#assign name1=value1 name2=value2 ... nameN=valueN>
<#assign name>
capture this
</#assign>
取值
${value}
空判断和集合对象遍历
<#if users??>
<#list userList as user>
第${user_index+1}个用户用户名:${user.userName},密码:${user.userPassword},年龄: ${user.age}
</#list>
<#else>
${user!"变量为空则给一个默认值"}
</#if>
比较运算符
FreeMarker 大于号>、小于号 <的使用 :与标签括号<>冲突的问题
解决方法:
1、用符号代替,例如:> gt,>= gte,< lt,<= lte
2、加括号 <#if(x>y)>
内建函数
FreeMarker在解析数据格式的时候,自动默认将数字按3为分割(1,000)
可在模板中加入<#setting number_format="#">
或者<#setting number_format="0">
取消自动分割
分割语法解析:
例如:"0.#",左边的'0'的个数代表整数部分最少为多少位,右边'#'的个数代表小数部分最多为多少位。
例如:",##0.0#" 表示整数部分的千位分割符是',',小数部分最多保留两位,最少保留一位;例如:"0.##%"以百分比的形式表示,小数部分最多两位。
假设strnum是一个数字,则可以这样写
{123456.123456?string(",##0.0#")}值为123,456.12
转化为纯数字形式: ${"123,456.123,456"?c}
<#assign data = "abcd1234">
第一个字母大写:${data?cap_first}
所有字母小写:${data?lower_case}
所有字母大写:${data?upper_case}
<#assign floatData = 12.34>
数值取整数:${floatData?int}
获取集合的长度:${users?size}
时间格式化:${dateTime?string("yyyy-MM-dd")}
<#assign tempNum=20>
${tempNum}
${tempNum?string.number}或${tempNum?string("number")} //结果为20
${tempNum?string.currency}或${tempNum?string("currency")} //结果为¥20.00
${tempNum?string. percent}或${tempNum?string("percent")} //结果为2,000%
<#--FreeMarker中的round、floor和ceiling数字的舍入处理-->
<#--round:四舍五入-->
<#--floor:向下取整-->
<#--ceiling:向上取整-->
<#assign numList = [12,0.23,89,12.03,69.56,45.67,-0.56,-8.05,-89.56,4.69]/>
<#list numList as num>
${num} ?round=${num?round} ?floor=${num?floor} ?ceiling=${num?ceiling}
</#list>
Map对象遍历
<#assign mapData={"name":"饱饱", "dream":"蝴蝶"}>
直接通过Key获取 Value值:${mapData["name"]}
通过Key遍历Map:
<#list mapData?keys as key>
Key: ${key} - Value: ${mapData[key]}
</#list>
通过Value遍历Map:
<#list mapData?values as value>
Value: ${value}
</#list>
算术运算
<#assign a=100 b=30>
"+" : ${a + b}
"-" : ${a - b}
"*" : ${a * b}
"/" : ${a / b}
"%" : ${a % b}
网友评论