FreeMarker基础入门知识5 -在模板中定义变量

来源:互联网 发布:vb提取网页数据 编辑:程序博客网 时间:2024/06/03 18:45

1:在模板中定义变量


正如我们已经描述过的,模板可以使用在数据模型中定义的变量。 在数据模型之外,模板本身也可以定义变量来使用。 这些临时变量可以使用FTL指令来创建和替换。请注意每一次的 模板执行 工作都维护它自己的私有变量, 同时来渲染页面。变量的初始值是空,当模板执行工作结束这些变量便被销毁了。

可以访问一个在模板里定义的变量,就像是访问数据模型根root上的变量一样。 这个变量比定义在数据模型中的同名参数有更高的优先级,也就是说, 如果恰巧定义了一个名为''foo''的变量,而在数据模型中也有一个名为''foo''的变量, 那么模板中的变量就会将数据模型根上的变量隐藏(而不是覆盖!)。 例如,${foo} 将会输出在模板中定义的变量。

在模板中可以定义三种类型的变量:

  • ''简单''变量: 它能从模板中的任何位置来访问,或者从使用 include 指令引入的模板访问。可以使用 assign 指令来创建或替换这些变量。因为宏和方法只是变量,那么 macro 指令 和 function 指令 也可以用来设置变量,就像 assign 那样。

  • 局部变量:它们只能被设置在 宏定义体内, 而且只在宏内可见。一个局部变量的生命周期只是宏的调用过程。可以使用 local指令 在宏定义体内创建或替换局部变量。

  • 循环变量:循环变量是由如 list 指令自动创建的,而且它们只在指令的开始和结束标记内有效。宏 的参数是局部变量而不是循环变量。

  • 全局变量:这是一个高级话题了, 并且这种变量最好别用。即便它们属于不同的命名空间, 全局变量也被所有模板共享,因为它们是被 import进来的, 不同于 include 进来的。那么它们的可见度就像数据模型那样。 全局变量通过 global指令来定义。

示例:使用 assign 创建和替换变量:

<#assign x = 1>  <#-- create variable x -->${x}<#assign x = x + 3> <#-- replace variable x -->${x}

输出为:

14

局部变量也会隐藏(不是覆盖)同名的''简单''变量。 循环变量也会隐藏(不是覆盖)同名的''简单''变量。例如:

<#assign x = "plain">1. ${x}  <#-- we see the plain var. here --><@test/>6. ${x}  <#-- the value of plain var. was not changed --><#list ["loop"] as x>    7. ${x}  <#-- now the loop var. hides the plain var. -->    <#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->    8. ${x}  <#-- it still hides the plain var. --></#list>9. ${x}  <#-- the new value of plain var. --><#macro test>  2. ${x}  <#-- we still see the plain var. here -->  <#local x = "local">  3. ${x}  <#-- now the local var. hides it -->  <#list ["loop"] as x>    4. ${x}  <#-- now the loop var. hides the local var. -->  </#list>  5. ${x}  <#-- now we see the local var. again --></#macro>

输出为:

1. plain  2. plain  3. local    4. loop  5. local6. plain    7. loop    8. loop9. plain2 

内部循环变量可以隐藏外部循环变量:

<#list ["loop 1"] as x>  ${x}  <#list ["loop 2"] as x>    ${x}    <#list ["loop 3"] as x>      ${x}    </#list>    ${x}  </#list>  ${x}</#list>

输出为:

  loop 1    loop 2      loop 3    loop 2  loop 1

请注意,循环变量的设置是通过指令调用时创建的(本例中的 <list ...> 标签)。 没有其他的方式去改变循环变量的值(也就是说,不能使用定义指令来改变它的值)。 从上面的示例来看,也可以使用一个循环变量来暂时隐藏另外一个。

有时会发生一个变量隐藏数据模型中的同名变量, 但是如果想访问数据模型中的变量,此时就可以使用 特殊变量 globals。例如,假设我们在数据模型中有一个名为 user 的变量,值为''Big Joe'':

<#assign user = "Joe Hider">${user}          <#-- prints: Joe Hider -->${.globals.user} <#-- prints: Big Joe -->

通过 global指令 设置的变量可以隐藏数据模型中的同名变量。通常,全局变量的设置会有精确的目的。 但仍然可以使用如下方式来访问数据模型变量:.data_model.user

想了解更多的变量使用语法,请阅读: 模板/表达式


0 0