FreeMarker四种变量的用法

原文:http://www.656463.com/article/286

FreeMarker四种变量的用法

2012-12-06 08:40:41| 发布者: 黄奕能| 查看: 381

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

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


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

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

@Test

public void test10() {

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

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

}

${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}

   1

   2

   3

李四


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


assign 

       assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量,
       assign指令的用法有多种,包含创建或替换一个顶层变量,或者创建或替换多个变量等,
       它的最简单的语法如下:
           <#assign name=value [in namespacehash]>,
           这个用法用于指定一个名为name的变量,该变量的值为value,
           此外,FreeMarker允许在使用assign指令里增加in子句,
           in子句用于将创建的name变量放入namespacehash命名空间中.

 

    assign指令还有如下用法:

      <#assign name1=value1 name2=value2 ... nameN=valueN [in namespacehash]>,

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

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

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

        <#assign name [in namespacehash]>capture this</#assign>,

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

      <#assign x>
      <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"]as n>
      ${n}
      </#list>
      </#assign>
      ${x}
      上面的代码将产生如下输出:

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

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

        如下例子:

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

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

                 <#assign x="Hello ${user}!">


FreeMarker 模板引擎中设置变量可以通过多种方式实现,具体取决于变量的作用域和使用场景。以下是几种常见的方法: ### 在 Java 代码中传递变量 在 Java 应用程序中,通常会通过 `Map` 将变量传递给模板。这些变量可以是简单的字符串、数字或复杂的对象结构。 ```java Map<String, Object> map = new HashMap<>(); map.put("name", "xiaoming"); Configuration cfg = FreeMarkers.defaultConfiguration(); cfg.setSharedVariable("share", "共享变量"); // 设置共享变量 [^2] String result = FreeMarkers.fileToStr("test1.ftl", map); // 使用 map 中的变量渲染模板 ``` 在模板文件(如 `test1.ftl`)中,可以直接引用这些变量: ``` Hello, ${name}! This is a shared variable: ${share} ``` ### 共享变量 如果需要在整个应用中使用某个变量,可以使用 `Configuration` 对象的 `setSharedVariable()` 方法设置共享变量 [^2]。这种方式适合用于全局配置信息或者跨模板使用的变量。 ### 在模板中定义局部变量 在模板内部也可以定义局部变量,使用 `<#assign>` 指令来创建新的变量或者修改现有变量的值: ```ftl <#assign version = "1.0.0"> The current version is ${version}. ``` 此方法适用于仅在当前模板内使用的变量 [^4]。 ### 动态计算变量 对于动态生成的内容,可以在模板中使用表达式来计算变量的值: ```ftl <#assign now = .now> Current date and time: ${now?string("yyyy-MM-dd HH:mm:ss")} ``` 这允许你在模板中利用 FreeMarker 提供的各种内置函数进行数据处理 [^1]。 ### 注意事项 - 当尝试访问未定义的变量时,FreeMarker 默认会抛出异常 [^1]。为了避免这种情况,可以使用 `??` 运算符检查变量是否存在,或者使用默认值操作符 `!` 来提供一个默认值。 ```ftl <#if someVar??> Variable exists. <#else> Variable does not exist. </#if> The value of the variable is ${someVar!defaultVal}. ``` - 如果打算替代 `freemarker.cache.TemplateCache` 来管理 `Template` 对象,则应在 `Template` 对象第一次使用前就设置好配置信息,并将 `Template` 对象视为只读 [^3]。 通过以上方法,可以根据实际需求灵活地在 FreeMarker 中设置和使用变量
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值