2014-10-29 39 views
0

目的:要使用的Freemarker生成以下形式插入列表项作为属性?

public void save(){ 
    helper.save(); 
} 

public void load(){ 
    helper.load(); 
} 

//Other such lifecycle methods 

的Java代码基本上,我有一个“生命周期”方法名了一把,我想为每一个他们的代码。但是,如果传入的模型对象需要它,我只会生成一个方法。我的模型类的样子:

public class Model{ 
    private boolean load; 
    private boolean save; 
    //bools for other lifecycle methods 

    public Model(boolean load, boolean save){ 
     this.load = load; 
     this.save = save; 
    } 

    public boolean getLoad(){ 
     return load; 
    } 

    public boolean getSave(){ 
     return save; 
    } 
} 

我Freemarker模板:

<#assign methodNames = ["load", "save"]> 
<#list methodNames as method> 
<#if model.method> 
public void ${method}(){ 
    helper.${method}(); 
} 
</#if> 
</#list> 

然而,<#if>声明不起作用。 Freemarker抱怨model.methodnull。它看起来像Freemarker在我的模型中寻找getMethod(),而不是将model解析为saveload,然后查找getSave()getLoad()

我尝试以下,但在所有情况下的Freemarker抱怨一个语法错误或其它:

<#assign methodNames = ["load", "save"]> 
<#list methodNames as method> 
<#assign methodRequired = r"model.${method}"> 
<#if <@methodRequired?interpret>> 
public void ${method}(){ 
    helper.${method}(); 
} 
</#if> 
</#list> 

这失败,出现错误,说我不能有<@methodRequired><#if>内。我也直接尝试<#if model.${method}>但这显然不起作用。

为了完整起见,这里是我如何调用模板:

//Obtain a writer object first. Then ... 
Model model = new Model(true, false); 
myTemplate.process(model, writer); 
writer.close(); 

所以,问题是 - 我怎么问的Freemarker给我一个列表变量的值从里面另一个模型对象?

回答

1

这和其他典型语言非常相似:model[method]model.method实际上是model["method"]的简写。你也可以写model["foo" + someVar]这样的东西,所以它的someContainer[someKeyExpression]

+0

这样做。我所要做的就是在'if'条件中使用这个语法:'<#if model [method]>' – curioustechizen 2014-10-30 07:31:25