解析 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 输出值为模板变量值“碧瑶”。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论