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