动态地将参数传递给freemarker宏

时间:2016-08-05 05:23:06

标签: macros freemarker

我在freemarker中有一个宏说

<#macro printHelloWorld var1 var2>  
    ${var1}  
    ${var2}  
</#macro>  

当我将此宏称为

<@macro printHelloWorld var1="hello" var2="world" />

以预期的方式打印它     你好     世界。

但是,我的问题是我想动态传递这个变量名。我从源代码动态接收宏参数, 我希望能够传递它们。

的内容
$paramater1 = "var1"
$parameter2 = "var2"
$valueForParameter1 = "hello"
$valueForParameter2 = "world"

<@macro printHelloWorld paramater1=valueForParameter1 parameter2=valueForParameter2 />

我想要等同于电话

<@macro printHelloWorld var1="hello" var2="world" />

我无法找到任何解决方案。有什么提示吗?

更多地描述用例

我们实际上有一个freemarker宏,通过Java Tag公开,它接受动态属性。我想能够调用这个宏,并动态地为它提供参数。

1 个答案:

答案 0 :(得分:1)

没有语言功能可以做到这一点。有两种可能做类似的事情:

  • 只需将FTL哈希(如public static double distanceOf(Geopoint a, Geopoint b) { if (a.isValid() && b.isValid()) { double distFactor = Math.acos(Math.sin(Math.toRadians(a.getLat())) * Math.sin(Math.toRadians(b.getLat())) + Math.cos(Math.toRadians(a.getLat())) * Math.cos(Math.toRadians(b.getLat())) * Math.cos(Math.toRadians(b.getLon()) - Math.toRadians(a.getLon()))); return 6378.388 * distFactor; } return -1; } )传递给宏,如Map。在这种情况下,参数值表达式也可以是用Java动态创建的<@myMacro params={'a': 1, 'b': 2}/>

  • 另一个是定义像Map这样的宏,在这种情况下,<#macro myMacro p1 p2 otherParams...><@myMacro p1=11 p2=22 a=1 b=1/>作为{'a': 1, 'b': 2}传递。但是,在这种情况下,您无法将外部构造的哈希传递为otherParams