【框架学习】Freemarker使用 - hippowc/hippowc.github.io GitHub Wiki

简介

FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写,FreeMarker 被设计用来生成 HTML Web 页面,但是用来生成代码也是非常的方便。

需要的依赖

<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.9</version>
</dependency>

quickStart

// 定义配置
Configuration conf = new Configuration();
// 设置模板路径
conf.setDirectoryForTemplateLoading(new File(dir));
// 加载模板
Template template = conf.getTemplate("/freemarker-demo.ftl");
// 定义属性
Map root = new HashMap();
root.put("world", "Hello World"); // 其中也可以放对象
// 定义输出
Writer out = new FileWriter(dir + "/freemarker.html");
// 生成模板
template.process(root, out);
out.flush();
out.close();

主要模板语法

1、字符输出

${emp.name?if_exists}      // 变量存在,输出该变量,否则不输出
${emp.name!}           // 变量存在,输出该变量,否则不输出
${emp.name?default("xxx")} // 变量不存在,取默认值xxx
${emp.name!"xxx"}       // 变量不存在,取默认值xxx

2、常用内部函数

${"123<br>456"?html}   // 对字符串进行HTML编码,对html中特殊字符进行转义
${"str"?cap_first}    // 使字符串第一个字母大写 
${"Str"?lower_case} // 将字符串转换成小写
${"Str"?upper_case} // 将字符串转换成大写
${"str"?trim} // 去掉字符串前后的空白字符

字符串的两种拼接方式拼接:
${"hello${emp.name!}"} // 输出hello+变量名
${"hello"+emp.name!} // 使用+号来连接,输出hello+变量名
// 截取子串
${str[1..4]}
${emp.date?string('yyyy-MM-dd')} //日期格式
${emp.name?string.number}  // 输出20
${emp.name?string.currency} // ¥20.00 
${emp.name?string.percent} // 20%
${1.222?int}            // 将小数转为int,输出1

3、声明变量

申明变量的几种方式
<#assign name=value>
<#assign name1=value1 name2=value2 ... nameN=valueN>
<#assign same as above... in namespacehash>
<#assign name> capture this </#assign>
<#assign name in namespacehash> capture this </#assign>

4、if

<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
</#if>

值得注意的是,${..}只能用于文本部分,不能用于表达式,
下面的代码是错误的:
<#if ${isBig}>Wow!</#if><#if "${isBig}">Wow!</#if>
// 正确写法<#if isBig>Wow!</#if>

// 非空判断
<#if aaa??> aaa是否为空

5、switch (条件可为数字,可为字符串)

<#switch value>
 <#case refValue1>
 ....
<#break> 
<#case refValue2> 
....
<#break>
 <#case refValueN>
 ....
<#break>
 <#default>
 ....
 </#switch>

6、集合 & 循环

// 遍历集合:
<#list empList! as emp> 
    ${emp.name!}
</#list>
// 可以这样遍历集合:
<#list 0..(empList!?size-1) as i>
    ${empList[i].name!}
</#list>

// 与jstl循环类似,也可以访问循环的状态。

empList?size    // 取集合的长度
emp_index:     // int类型,当前对象的索引值 
emp_has_next:     // boolean类型,是否存在下一个对象
// 使用<#break>跳出循环
<#if emp_index = 0><#break></#if>

// 集合长度判断 
<#if empList?size != 0></#if> // 判断=的时候,注意只要一个=符号,而不是==

<#assign l=0..100/>    // 定义一个int区间的0~100的集合,数字范围也支持反递增,如100..2
<#list 0..100 as i>   // 等效于java for(int i=0; i <= 100; i++)
  ${i}
</#list>

// 截取子集合:
empList[3..5] //返回empList集合的子集合,子集合中的元素是empList集合中的第4-6个元素

// 创建集合:
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>

// 集合连接运算,将两个集合连接成一个新的集合
<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>

// 除此之外,集合元素也可以是表达式,例子如下:
[2 + 2, [1, 2, 3, 4], "whatnot"]
/ seq_contains:判断序列中的元素是否存在
<#assign x = ["red", 16, "blue", "cyan"]> 
${x?seq_contains("blue")?string("yes", "no")}    // yes
${x?seq_contains("yellow")?string("yes", "no")}  // no
${x?seq_contains(16)?string("yes", "no")}        // yes
${x?seq_contains("16")?string("yes", "no")}      // no

// seq_index_of:第一次出现的索引
<#assign x = ["red", 16, "blue", "cyan", "blue"]> 
${x?seq_index_of("blue")}  // 2

// sort_by:排序(升序)
<#list movies?sort_by("showtime") as movie></#list>

// sort_by:排序(降序)
<#list movies?sort_by("showtime")?reverse as movie></#list>

// 具体介绍:
// 不排序的情况:
<#list movies as moive>
  <a href="${moive.url}">${moive.name}</a>
</#list>
//要是排序,则用
<#list movies?sort as movie>
  <a href="${movie.url}">${movie.name}</a>
</#list>

// 这是按元素的首字母排序。若要按list中对象元素的某一属性排序的话,则用
<#list moives?sort_by(["name"]) as movie>
  <a href="${movie.url}">${movie.name}</a>
</#list>

//这个是按list中对象元素的[name]属性排序的,是升序,如果需要降序的话,如下所示:
<#list movies?sort_by(["name"])?reverse as movie>
  <a href="${movie.url}">${movie.name}</a>
</#list>

7、Map对象

// 创建map
<#assign scores = {"语文":86,"数学":78}>

// Map连接运算符
<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>

// Map元素输出
emp.name       // 全部使用点语法
emp["name"]    // 使用方括号

8、定义宏

<#-- 定义宏 -->
<#macro test foo bar="Bar" baaz=-1> 
  Text: ${foo}, ${bar}, ${baaz}
</#macro>

<#-- 使用宏 -->
<@test foo="a" bar="b" baaz=5*5/>  // 输出:Text: a, b, 25
<@test foo="a" bar="b"/>        // 输出:Text: a, b, -1
<@test foo="a" baaz=5*5-2/>     // 输出:Text: a, Bar, 23
<@test foo="a"/>                   // 输出:Text: a, Bar, -1

⚠️ **GitHub.com Fallback** ⚠️