Variables, scopes

本章介绍了模板尝试访问变量时发生的情况以及变量的存储方式。

当您调用Template.process时,它将在内部创建一个Environment对象,该对象将一直使用直到process返回。该对象存储模板处理的运行时状态。除其他事项外,它使用assignmacrolocalglobal等指令存储由模板创建的变量。它永远不会尝试修改传递给process调用的数据模型对象,也不会创建或替换存储在配置中的共享变量。

当您尝试读取变量时,FreeMarker 将按此 Sequences 查找变量,并在找到具有正确名称的变量时停止:

  • 在环境中:

  • 如果在循环中,则在循环变量集中。循环变量是由诸如list的指令创建的变量。

    • 如果在宏内,则在宏的局部变量集中。可以使用local指令创建局部变量。另外,宏的参数是局部变量。

    • 在当前的namespace中。您可以使用assign指令将变量放入命名空间。

    • 在使用global指令创建的变量集中。 FTL 处理这些变量就好像它们是数据模型的普通成员一样。也就是说,它们在所有名称空间中都是可见的,您可以像在数据模型中一样访问它们。

  • 在数据模型对象中,您已经传递给process方法

  • 在存储在Configuration中的一组共享变量中

实际上,从模板作者的角度来看,这 6 层仅是 4 层,因为从该角度来看,最后 3 层(使用global创建的变量,实际数据模型对象,共享变量)共同构成了全局变量集。

请注意,可以使用special variables从 FTL 中的特定层获取变量。