Freemarker变量赋值问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Freemarker变量赋值问题相关的知识,希望对你有一定的参考价值。

<#macro pager totalPage curPage=1 showPageNum=10>
<#if (showPageNum > totalPage)>
<#assign showPageNum = totalPage-1><br/>
</#if>
$showPageNum
</#macro>
如上代码在if语句成立情况下为什输出showPageNum时得到的结果为10而不是赋值后的结果?将assign中变量换成其他变量则可得到正确值。求解释,合理解释分数可适当提高。

<#macro pager totalPage curPage=1 showPageNum=10>
<#if (showPageNum > totalPage)>
<#local showPageNum = totalPage-1><br/>
</#if>
$showPageNum
</#macro>

解释:global、assign、local(macro参数)、list(由list创建的循环变量如:<#list a as x>)关系
global 全局变量,在所有命名空间可见
assign 当前命名空间可见
local(macro参数) 局部变量,当前宏内可见
循环变量(<#list a as x>) 当前循环可见
他们之间的关系 循环变量会隐藏局部变量(local创建的或macro参数)
局部变量(local创建的或macro参数)会隐藏assign(创建的变量)
assign(创建的变量)会隐藏global追问

不好意思,前几天比较忙。在assign里面用一个新的变量时,在下面输出的是赋值后的值,但如果是用macro中传入的变量则输出的是未改变前的值。这应该和隐藏变量没有什么关系吧,因为assign变量是当前空间可见。
是否意味使用一次assign就是重新定义了一个新的变量,只是这个变量与传入变量名一致所以导致被隐藏?不知这样理解是否正确。

追答

可以这样理解

参考技术A 不要用>,小于 大于 在freemarker里面都是用gt lt来表示的,正确的写法应该是

<#macro pager totalPage curPage=1 showPageNum=10>
<#if (showPageNum gt totalPage)>
<#assign showPageNum = totalPage-1><br/>
</#if>
$showPageNum
</#macro>追问

感谢您的提醒,谢谢。楼下的回答相对要精确些,谢谢。

Apache freemarker 模板分配和比较值

【中文标题】Apache freemarker 模板分配和比较值【英文标题】:Apache freemarker template assign and compare values 【发布时间】:2021-11-17 13:28:30 【问题描述】:

我正在使用下面的赋值语句为变量 i_type 赋值。

<#assign i_type>  
<#if x.has("type")>
    <#if x.type == "ABC">"ABC"<#else>"$x.type?lower_case"</#if>
<#else>"pqr"</#if>
</#assign>

那我想在ftl转换中赋值一个变量为:

"final_type" : <#if i_type?has_content && i_type == "pqr">1<#else>0</#if>

但在所有情况下,final_type 的值始终为 0。 我明确打印了 i_type 的值,即使它是“pqr”,但条件总是为假。

应该改变什么?

【问题讨论】:

【参考方案1】:

为什么原始示例不起作用是因为您在 &lt;#else&gt;"pqr"&lt;/#if&gt; 和其他类似位置有引号。这样捕获的值本身将包含引号,因为 FreeMarker 指令的嵌套内容不是表达式,而是就像***模板内容一样。所以就写&lt;#else&gt;pqr&lt;/#if&gt;

无论如何,写下你所做的事情的更好方法是:

<#assign i_type =
   x.has("type")?then(
     (x.type == "ABC")?then(x.type, x.type?lower_case),
     "pqr"
   )
>

您也不需要第二段代码中的i_type?has_content 条件,因为总是将某些东西分配给i_type。 (但即使实际上并非如此,您也可以写 i_type! 以将缺失值默认为 ""。)所以可以这样写:

"final_type" : $(i_type == "pqr")?then("1", "0")

【讨论】:

它有效。感谢您提供详细信息。 如果答案有效,请也​​接受它(绿色复选标记)。【参考方案2】:

我用过一次

"final_type" : <#if i_type?has_content && i_type?eval == "pqr">1<#else>0</#if>

效果很好。

【讨论】:

不要那样做。您调用?eval 只是为了删除您自己添加的引号。您可以不添加它们。

以上是关于Freemarker变量赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

freemarker 取值赋给变量

Apache freemarker 模板分配和比较值

java 用freemark的好处

静态变量赋值问题

freemarker 能否实现数组赋值?

shell变量重新赋值问题