FreeMarker-四种变量的⽤法
freemarker的变量可以分为四种,分别是数据模型的变量(root中的变量),模板中的变量使⽤(<#assign>定义的变量),局部变量(在指令中的变量)和循环变量。
【1】数据模型的变量
直接从模型中给模板传值的变量就是数据模型的变量,它把变量的值放在⼀个map中,在模板中直接可以⽤。
Java代码:
假字开头的成语@RequestMapping("/hello")
public ModelAndView hello(){
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "hello world !");
mv.tViewName("hello");
return mv;
英雄联盟网吧特权}
FTL⽂件:
${msg}
//hello world !
【2】模板中的变量
模板中的变量,是使⽤<#assign/>定义的变量。如果模板中定义的变量和模型中的变量名称⼀致,不是覆盖,⽽是隐藏。
FTL⽂件:
绿松石硬度
<#assign msg="Hi"/>
<#--此时模板中的变量的名称和模型中的变量名称⼀致,不是覆盖,⽽是隐藏-->
${msg}
白眉拳//Hi
模型中的变量被隐藏后,可以使⽤.globals可以访问模型中的变量.
<#--使⽤.globals可以访问模型中的变量-->
${.globals.msg}
//hello world !
【3】局部变量
使⽤local可以声明局部变量。
FTL⽂件:
<#--
此时当调⽤该指令之后,会将模板中的变量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=ameN=valueN [in namespacehash] />
这个语法可以同时创建或替换多个顶层变量。
此外,还有⼀种复杂的⽤法。
如果需要创建或替换的变量值是⼀个复杂的表达式, 则可以使⽤如下语法格式:
<#assign name [in namespacehash]>capture this</#assign>
在这个语法中,是指将assign指令的内容赋值给name变量.如下例⼦:
<#list ["星期⼀", "星期⼆", "星期三", "星期四", "星期五", "星期六", "星期天"]as n> ${n}
</#list>
欧洲最长的河流
</#assign>
${x}
上⾯的代码将产⽣如下输出:
星期⼀星期⼆星期三星期四星期五星期六星期天
学生会规章制度虽然assign指定了这种复杂变量值的⽤法,但是我们也不要滥⽤这种⽤法。
如下例⼦:
<#assign x>Hello ${ur}!</#assign>
以上代码改为如下写法更合适:
<#assign x="Hello ${ur}!"/>