模版中定义变量

模板除了可以使用在数据模型中定义的变量,模板本身也可以定义变量来使用。这些临时变量可以使用 FTL 的 assign 指令来创建和替换。

注意:每一次模板执行都维护它自己的私有变量,同时来渲染页面。变量的初始值是空,当模板执行工作结束这些变量便被销毁了。

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

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

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

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

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

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

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

<#-- 创建变量 x -->
<#assign x = 1>
${x}
<#-- 替换变量 x -->
<#assign x = x + 3>
${x}

输出为:

1
4

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

<#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. local
6. plain
    7. loop
    8. loop
9. 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 ...></#list> 标签)。没有其他的方式去改变循环变量的值 (也就是说,不能使用定义指令来改变循环变量的值)。 从上面的示例来看,也可以使用一个循环变量来暂时隐藏另外一个。

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

<!-- 定义变量,隐藏数据模型中的 user 变量 -->
<#assign user = "Joe Hider">
${user}          <#-- prints: Joe Hider -->
${.globals.user} <#-- prints: Big Joe -->

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

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号