解析 FreeMarker 中的四种变量和使用方法
原创
freemarker
FreeMarker
中的变量可以分为四种,分别是数据模型变量,模板变量,局部变量和循环内变量。
数据模型变量 -- root 中的变量
直接从后台数据模型( model )中给模板传值的变量就是数据模型变量,它把变量的值放在一个 map 中,可以在模板中直接使用符号 ${var_name}
取值。
@Test
public void testModelVariable() {
// somthing else ...
root.put("username","东方不败");
fu.print("modelVariable.ftl",root);
}
在 ftl 中使用 ${username}
取值,在页面上输出值为“东方不败”。
模板变量 -- <#assign> 标签定义的变量
模板变量,是使用 <#assign>
定义的变量,如果模板中定义的变量和数据模型中的变量名称相同,并不会覆盖掉数据模型中变量及其值,而是 隐藏
数据模型中对应的变量。
<#assign username="碧瑶">
<#-- 此时模板中变量的名称和数据模型中变量的名称相同,不是覆盖,而是隐藏 -->
${username}
<#-- 在页面上输出为“碧瑶” -->
数据模型中的变量被隐藏后,可以使用 .globals
来访问数据模型中相应的变量。
<#-- 使用 .globals 访问数据模型中的变量 -->
${.globals.username}
<#-- 输出为“东方不败” -->
局部变量 -- 在指令中的变量
局部变量最常用的情况是在自定义指令中,使用 <#local>
标签声明。
<#macro test>
<#--
错误示范:
当调用该指令之后,会将模板中的变量username覆盖为重楼,
这种方式存在风险,所以一般不使用这种方式在指令中定义变量
-->
<#--<#assign username="重楼"/>-->
<#--使用local可以声明局部变量,所以在marco中非特殊使用局部变量-->
<#local username="重楼"/>
${username}
</#macro>
<#-- 测试部分 -->
<@test/><#-- 局部变量输出为“重楼” -->
<#-- 模板变量输出为“碧瑶” -->
${username}
循环内变量 -- 在循环体中定义的变量
在 <#list>
循环中定义的变量,循环体中的变量只在循环中有效,也是临时变量的一种定义方式。
<#list 1..3 as username>
<#-- 循环中的变量出了循环就消失 -->
${username}
</#list>
${username}
上面 list 循环体内的 username
依次输出的值为 1,2,3。而循环体外的 username
输出值为模板变量值“碧瑶”。