常见指令

FreeMarker中,使用<#指令名>配置相关指令。

assign 自定义变量指令

使用assign指令可以声明一个新的变量,或者替换一个已经存在的变量。
assgin声明变量必须给一个初始化值,因为freemarker不能处理null。
assign指令是个单标签,不需要闭合。

  1. <!-- 声明一个变量 -->
  2. <#assign str="hello">
  3. ${str}<br>
  4. <!-- 使用闭合标签形式设置变量值 -->
  5. <#assign testValue>
  6. 这是testValue
  7. </#assign>
  8. <!-- 声明多个变量时,中间使用空格隔开 -->
  9. <#assign num=1 names=['张三','李四','王五']>
  10. ${num}<br>
  11. ${names?join(",")}<br>
  12. <!-- 对于已经存在的变量,可以对值进行替换 -->
  13. <#assign businessSum=2356>
  14. ${businessSum}

if 逻辑判断指令

可以使用ifelseifelse指令来判断是否满足某些条件。

  1. <!-- if判断 -->
  2. <#if businessSum < 100>
  3. businessSum过小:${businessSum}
  4. <!-- 判断是否相等 -->
  5. <#elseif businessSum == 100>
  6. businessSum等于100:${businessSum}
  7. <!-- 可以用尖括号判断大小,也可以使用 gt、lt等操作符 -->
  8. <#elseif businessSum gt 100 && businessSum lt 10000>
  9. businessSum值为:${businessSum}
  10. <#else >
  11. businessSum值不合适:${businessSum}
  12. </#if>
  13. <hr>
  14. <!-- 两个问号判断变量是否存在,存在为true -->
  15. <#if balance??>
  16. balance为:${balance}
  17. <!-- 变量不存在 -->
  18. <#else>
  19. balance变量不存在
  20. </#if>

list 遍历指令

可以使用list指令来对序列进行遍历。

  1. <#list users as user>
  2. ${user.name}:${user.age}<br>
  3. </#list>

list指令遍历时也可以判断集合是否存在,也可以和if指令配合使用:

  1. <!-- 声明一个没有数据的users2 -->
  2. <#assign users2 = []>
  3. <!-- if判断中,users2变量存在 -->
  4. <#if users2??>
  5. users2存在<br>
  6. <#else>
  7. users2不存在<br>
  8. </#if>
  9. <!-- 使用list指令遍历users2 -->
  10. <#list users2 as user>
  11. ${user}<br>
  12. <!-- users2为空集合时,会进入else -->
  13. <#else>
  14. 当前没有数据
  15. </#list>

macro 自定义宏指令

可以使用macro指令来自定义一些指令。

格式:

  1. <#macro 指令名>
  2. 指令内容
  3. </#macro>
  4. <#macro 指令名 参数1 参数2>
  5. 指令内容
  6. </#macro>

使用自定义指令:

  1. <!-- 使用@符号进行调用 -->
  2. <@指令名 参数1=参数1值 参数2=参数2值></@指令名>

指令可以被多次调用。

自定义指令的指令内容中既可以是普通字符串,也可以包含内置指令。

示例:

  1. <#macro myDirect>
  2. 这是一个自定义指令<br>
  3. </#macro>
  4. <@myDirect></@myDirect>
  5. <@myDirect></@myDirect>
  6. <#macro myDirect2 name age>
  7. 用户名:${name}<br>
  8. 年龄:${age?string}<br>
  9. </#macro>
  10. <@myDirect2 name="张三" age=19></@myDirect2>
  11. <#macro myDirect3 nameList>
  12. <#list nameList as tempName>
  13. ${tempName}<br>
  14. </#list>
  15. </#macro>
  16. <#assign myNameList=["张三","李四","王五"]>
  17. <@myDirect3 nameList=myNameList></@myDirect3>

nested 占位指令

nested 指令执行自定义指令开始和结束标签中间的模板片段。嵌套的片段可以包含模板中任意合法的内容。

可以配合macro指令使用。在macro中需要显示自定义内容的位置使用nested指令占位,该位置最终会显示自定义指令标签内的内容

  1. <#macro testNested>
  2. <#nested>
  3. <br>
  4. test
  5. <br>
  6. <#nested>
  7. </#macro>
  8. <@testNested>
  9. <h4>嵌套的内容</h4>
  10. </@testNested>

import 导入指令

import指令可以引入一个库,也就是说,它创建一个新的命名空间,然后在那个命名空间中执行给定路径的模板。可以使用引入的空间中的指令。

定义一个通用的自定义指令模板文件:commons.ftl

  1. <#macro myDirect>
  2. <h4>这是commons.ftl中的myDirect指令</h4>
  3. </#macro>
  4. <#macro myDirect2>
  5. <h4>这是commons.ftl中的myDirect2指令</h4>
  6. </#macro>

在其他模板文件中引入commons.ftl,并使用其中的指令:

  1. <!-- 引入commons.ftl,并将其指定为 common 命名空间 -->
  2. <#import "commons.ftl" as common>
  3. <!-- 使用 @命名空间.指令 的形式调用commons.ftl中的自定义指令 -->
  4. <@common.myDirect></@common.myDirect>
  5. <@common.myDirect2></@common.myDirect2>

include 包含指令

可以使用 include 指令在你的模板中插入另一个文件(FreeMarker模板文件、txt文件、html文件等)。被包含模板的输出格式是在 include 标签出现的位置插入的。被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。

  1. 引入html文件:<br>
  2. <#include "test.html">
  3. <hr>
  4. 引入txt文件:<br>
  5. <#include "test.txt">
  6. <hr>
  7. 引入ftl文件:<br>
  8. <#include "test.ftl">

注:引入的 txt 文本文件内如果含有FreeMarker语法,也会被解析执行。

例如 txt 文件为下面内容时

  1. <#assign msg2="aaa">
  2. 这是一个txt文本文件 ${msg2}

最终显示的结果为:这是一个txt文本文件 aaa