FreeMarker - 四种变量的用法

简介: FreeMarker - 四种变量的用法

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


【1】数据模型的变量


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

Java代码:

    @RequestMapping("/hello")
    public ModelAndView hello(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "hello world !");
        mv.setViewName("hello");
        return mv;
    }


FTL文件:

${msg}
//hello world !


【2】模板中的变量

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


FTL文件:

<#assign msg="Hi"/>
<#--此时模板中的变量的名称和模型中的变量名称一致,不是覆盖,而是隐藏-->
${msg}
//Hi


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

<#--使用.globals可以访问模型中的变量-->
${.globals.msg}
//hello world !

【3】局部变量

使用local可以声明局部变量。

FTL文件:

<#macro test>
   <#--
   此时当调用该指令之后,会将模板中的变量msg覆盖为Hi
   所以这种方式存在风险,所以一般不使用这种方式在指令中定义变量
   -->
   <#--<#assign  msg="Hi"/>-->
   <#--使用local可以声明局部变量,所以在marco中非特殊使用局部变量-->
   <#local  msg="Hi"/>
   ${msg}
</#macro>
<@test/>
${msg}


【4】循环变量

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

<#list 1..3 as msg>
   <#--循环中的变量出了循环就消失-->
   ${msg}
</#list>
//result as follows :
1
2
3

【5】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}!"/>
目录
相关文章
|
JSON 算法 Java
常见登录密码加密方式
常见登录密码加密方式
2532 0
|
缓存 自然语言处理 Java
详解FreeMarker Template:在Spring Boot中实现动态内容生成
详解FreeMarker Template:在Spring Boot中实现动态内容生成
2493 13
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
Java UED Spring
Springboot通过SSE实现实时消息返回
通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。
6619 1
|
Java Windows
IDEA不使用lombok,如何快速生成get和set方法
【11月更文挑战第10天】在 IntelliJ IDEA 中生成 `get` 和 `set` 方法有多种方式:通过菜单操作、使用快捷键或自定义模板。菜单操作包括选择“Code”菜单中的“Generate...”,快捷键为“Alt + Insert”。自定义模板可在“File”-&gt;“Settings”-&gt;“Editor”-&gt;“Code Style”-&gt;“Java”中设置。批量生成时,可多选变量一次性生成。
3322 2
|
Java 数据处理 Spring
Spring Boot中的模板引擎选择与配置
Spring Boot中的模板引擎选择与配置
1418 0
|
Java
解决freemarker数组中的对象属性获取不到
解决freemarker数组中的对象属性获取不到
688 1
|
开发框架 前端开发 JavaScript
FreeMarker的基本语法
FreeMarker的基本语法
612 0
FreeMarker的基本语法