freemarker四种变量介绍

freemarker的变量可以分为四种,分别是数据模型的变量【root中的变量】,模板中的变量使用【<#assign>定义的变量】,局部变量【在指令中的变量】,循环变量【在循环中的变量】

数据模型的变量【root中的变量】

直接从模型中给模板传值的变量就是数据模型的变量,它把变量的值放在一个map中,在模板中直接可以用。

@Test

publicvoidtest10(){

root.put("username","张三");

fu.print("10.ftl",root);

}

${username}

张三

模板中的变量使用【<#assign>定义的变量】

模板中的变量,是使用<#assign定义的变量,如果模板中定义的变量和模型中的变量名称一致,不是覆盖,而是隐藏

<#assignusername="李四">

<#--此时模板中的变量的名称和模型中的变量名称一致,不是覆盖,而是隐藏-->

${username}

李四

模型中的变量被隐藏后,可以使用.globals可以访问模型中的变量

<#--使用.globals可以访问模型中的变量-->

${.globals.username}

张三

局部变量【在指令中的变量】

使用local可以声明局部变量

<#macrotest>

<#--

此时当调用该指令之后,会将模板中的变量username覆盖为王五

所以这种方式存在风险,所以一般不使用这种方式在指令中定义变量

-->

<#--<#assignusername="王五"/>-->

<#--使用local可以声明局部变量,所以在marco中非特殊使用局部变量-->

<#localusername="王五"/>

${username}

</#macro>

<@test/>

${username}

王五

李四

循环变量【在循环中的变量】

在list循环中定义的变量,循环中的变量只在循环中有效,也是一种临时的变量定义方式

<#list1..3asusername>

<#--循环中的变量出了循环就消失-->

${username}

</#list>

${username}

1

2

3

李四

本文链接:FreeMarker四种变量的用法,本文由huangyineng原创,转载请注明出处

assign

assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量,

assign指令的用法有多种,包含创建或替换一个顶层变量,或者创建或替换多个变量等,

它的最简单的语法如下:

<#assignname=value[innamespacehash]>,

这个用法用于指定一个名为name的变量,该变量的值为value,

此外,FreeMarker允许在使用assign指令里增加in子句,

in子句用于将创建的name变量放入namespacehash命名空间中.

assign指令还有如下用法:

<#assignname1=value1name2=value2...nameN=valueN[innamespacehash]>,

这个语法可以同时创建或替换多个顶层变量,此外,还有一种复杂的用法,

如果需要创建或替换的变量值是一个复杂的表达式,

则可以使用如下语法格式:

<#assignname[innamespacehash]>capturethis</#assign>,

在这个语法中,是指将assign指令的内容赋值给name变量.如下例子:

<#assignx>

<#list["星期一","星期二","星期三","星期四","星期五","星期六","星期天"]asn>

${n}

</#list>

</#assign>

${x}

上面的代码将产生如下输出:

星期一星期二星期三星期四星期五星期六星期天

虽然assign指定了这种复杂变量值的用法,但是我们也不要滥用这种用法,

如下例子:

<#assignx>Hello${user}!</#assign>,

以上代码改为如下写法更合适:

<#assignx="Hello${user}!">

===============================================================

解释:global、assign、local(macro参数)、list(由list创建的循环变量如:<#listaasx>)关系

global全局变量,在所有命名空间可见

assign当前命名空间可见

local(macro参数)局部变量,当前宏内可见

循环变量(<#listaasx>)当前循环可见

他们之间的关系循环变量会隐藏局部变量(local创建的或macro参数)

局部变量(local创建的或macro参数)会隐藏assign(创建的变量)

assign(创建的变量)会隐藏global

相关推荐