Freemarker中的While循环



如何在Freemarker(FTL)中创建类似的循环?在freemarker中,我有这样的语句:

<#if myVariable?? >
// do stuff
</#if>

,我想把它转换成一个while循环是可能的吗?

我想复制的javascript -代码

while (myVariable != null) {
// do stuff
}

如果不可能,如何递归的方法在Freemarker?

模板语言只支持通过#list进行循环。如果你需要这样的循环,变通方法是:

<#list 0..1000000000 as _>
<#if exitCondition><#break></#if>
...
</#list>

您可以使用递归的macro:

<#macro doStuff>
<#if myVariable?? >
// do stuff
<@doStuff/>
</#if>
</#macro>
<@doStuff/>

还有一个函数形式的实现,它使用其他函数作为输入来进行处理并评估是否继续的条件:

<#function while(input, fn, condition, args = [])>
<#if !fn?is_directive || !condition?is_directive>
<#return 'No processing or condition function provided!' />
</#if>

<#local result = fn(input, args) />
<#return condition(result)?then(result, while(result, fn, condition, args)) />
</#function>

<#-- Helper functions that would do the processing and provide the condition -->
<#function $length(input = '', max = 6)>
<#return (input?length >= max) />
</#function>
<#function $add(input = '', args = [])>
<#return input?right_pad(input?length+1, 'x') />
</#function>

${while('ab', $add, $length)} => 'abxxxx'

请注意,如果退出条件出错并导致无限循环,那么使用这些方法中的任何一种都可能导致服务器瘫痪,就像在所有其他语言中一样;)

最新更新