目录
在线中文参考手册:http://freeMarker.foofun.cn/toc.html
在线模板测试网站:https://try.freeMarker.apache.org
一、了解FreeMarker
模板引擎,基于模板和要改变的数据,用来生成输出文本(HTML网页、电子邮件、配置文件、源代码)的通用工具。是一个Java类库,一款组件。
与JSP区别:FreeMarker是根据模板生成各种文件,而JSP是需要jsp的引擎,来解析成servlet,然后把servlet编译成字节码文件来执行。
FreeMarker的特点:
彻底分离表现层和业务逻辑
性能好,提高开发效率
使得开发过程中的人员分工更加明确
学习成本低
支持表达式、宏定义(类似jsp标签)
二、FreeMarker基本语法
1、数据类型:
标量:基本数据类型。字符串、数字、布尔值、日期/时间
容器:哈希表(类似于HashMap)、序列(类似于List)、集合
子程序:方法和函数、用户自定义指令
2、算术运算符
数字运算:+-*/%
字符串运算:${name}、${"hello,${name}"}、${"hello,"+name}、<#if isBig>Wow!</#if>、变量下标为0和4的字符:${name[0]}${name[4]}、下标为0到4的字符:${name[0..4]}
指令:以<#标识:错误:<#if ${isBig}>Wow!</#if> 正确:<#if isBig>Wow!</#if>,isBig变量不需要加表达式,可以直接写
逻辑运算符:与&&、或||、非!
比较运算符:>(gt) <(lt) >=(gte) <=(lte) ==(或=) != (推荐使用英文符号)
只能比较数字和日期,不能比较字符串,返回为布尔类型不能直接输出
由于FreeMarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,比如<#if (x>y)>
空值运算符:
??(判断是否为空):FreeMarker中没有null的定义,需要判断是否为空。
检查对象的属性是否为空:<#if object.attribute??></#if>,检查对象或属性是否为空:<#if (object.attribute)??></#if>
!(指定缺少变量的默认值,如果不指定则默认值是空字符串、长度为0的序列或长度为0的Map对象)
${aaa!}:如果aaa变量没定义,不报错,默认没有任何输出
${aaa!'-'}:如果aaa变量没定义,为空,就默认设置该表达式输出的值为横杠-,这里不会为aaa变量赋值
${(user.name)!"默认值"}:如果user或name为空,就输出默认值
${user.name!"默认值"}:如果user为空会报错,如果name为空会输出默认值
3、模板中的代码片段
${...}:表达式,称为interpolation插值
注释:<#-- --> 注释的内容不会输出
FTL标签:FreeMarker的指令。这些标签的名字以#开头。用户自定义的标签则需要使用@来代替#。
4、基本指令
条件判断指令:
if指令:<#if 条件>输出</#if>
if-else指令:<#if 条件>输出<#else>输出</#if>
if-elseif-else指令:<#if 条件1>输出<#elseif 条件2>输出<#else>输出</#if>
switch、case、break、default指令:参数可以为数字、字符串。<#switch var><#case 条件1>输出<#break><#case 条件2>输出<#break><#default>输出</#switch>
三、FreeMarker快速入门
静态网页、动态网页
页面静态化:适用于高并发、要求响应速度快、大规模且数据变化不太频繁的页面场景
使用FreeMarker生成HTML文件
使用FreeMarker生成Java类
还写什么curl,通通搞个模板一键生成!!!
四、FreeMarker高级指令--list
1、list指令:两种写法
<#list users as user>
${user}
<#else>
"list为空"
</#list>
或
<#list users>
<ul>
<#items as user>
<li>${user}</li>
</#items>
</ul>
<#else>
<p>"list为空"
</#list>
2、sep指令:可在每一个迭代项中间放一些内容,不会把内容插入到第一项之前或最后一项之后。可结合迭代指令List使用
<#list users as user>
${user}<#sep>, </#sep>
</#list>
通过内建函数实现sep指令效果:
<#list users as user>
${user}<#if user?has_next>, </#if>
</#list>
3、break指令:配合if指令使用,满足条件时跳出迭代
<#list 1..10 as x>
${x}
<#if x=3><#break></#if>
</#list>
1..10:代表1到10
4、list指令排序
升序:sort、sort_by()
对users升序排序:
<#list users?sort as user>
</#list>
根据年龄对用户list升序排序:
<#list users?sort_by("age") as user>
</#list>
降序:sort_by()?reverse
<#list users?sort_by("age")?reverse as user>
</#list>
5、list遍历Map
<#list dataMap?keys as key>
<option value="${key}">${dataMap[key]}</option>
${key}-${dataMap[key]}<#if key?has_next>, </#if>
</#list>
像else、items、break只能在指令体内部使用,而不能移出到宏或被包含的模板中
五、FreeMarker--内建函数
内建函数:由语法规定存在的内建函数。包含在编译器的运行时库中,直接调用即可,其实现由编译器对应的厂商完成。
使用到的内建函数:sort、sort_by、reverse、keys、has_next
特点:都是写在?后面,实现某个功能(函数)
编译器提供了针对各种数据类型的内建函数、结点(xml)内建函数、循环变量内建函数、独立类型内建函数、其他内建函数(很少使用或专家级的)
相关内建函数参考可见:http://freemarker.foofun.cn/ref_builtins.html
六、FreeMarker在web项目中的应用
1、添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2、指定freemarker文件的后缀为ftl,默认为ftlh
spring.freemarker.suffix=.ftl
3、创建一个以.ftl为后缀的文件 src\main\resources\templates\test.ftl
<html>
<body>
<div class="container">
<table class="table table-dark table-hover">
<thead>
<tr>
<th>name</th>
<th>age</th>
<th>sex</th>
</tr>
</thead>
<tbody>
<#list userlist?sort_by("age") as user>
<tr>
<td>
<#if (user.name)??>
${user.name}
<#else>
姓名不详
</#if>
</td>
<td>${user.age!"年龄不详"}</td>
<td>${user.sex!"性别不详"}</td>
</tr>
</#list>
</tbody>
</table>
</div>
</body>
</html>
4、编写Controller,跳转到freemarker文件
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestUser {
private String name;
private String age;
private String sex;
}
@Controller
public class TestController {
@RequestMapping("/test")
public String test(HttpSession session){
TestUser user1 = new TestUser("zhangsan","23","男");
TestUser user2 = new TestUser("lisi","18",null);
TestUser user3 = new TestUser(null,"20","女");
List<TestUser> userlist = new ArrayList();
userlist.add(user1);
userlist.add(user2);
userlist.add(user3);
session.setAttribute("userlist",userlist);
return "test";
}
}
5、效果展示