目标:使用Freemarker生成以下格式的Java代码
public void save(){
helper.save();
}
public void load(){
helper.load();
}
//Other such lifecycle methods
基本上,我有一小部分"生命周期"方法名称,我想为每个方法生成代码。但是,如果传入的模型对象需要它,我只生成一个方法。我的模型类看起来像:
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;
}
}
我的自由标记模板:
<#assign methodNames = ["load", "save"]>
<#list methodNames as method>
<#if model.method>
public void ${method}(){
helper.${method}();
}
</#if>
</#list>
但是,<#if>
语句不起作用。 Freemarker抱怨model.method
是null
。看起来Freemarker正在我的模型中寻找getMethod()
,而不是将model
解析为save
或load
,然后寻找getSave()
或{{1} }。
我尝试了以下内容,但在所有情况下,Freemarker都抱怨一个语法错误或另一个:
getLoad()
此操作失败,并显示错误消息,指出我<#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}>
所以,问题是 - 如何让Freemarker从另一个模型对象中向我提供列表变量的值?
答案 0 :(得分:1)
它与其他典型语言非常相似:model[method]
。 model.method
实际上是model["method"]
的简写。你也可以写model["foo" + someVar]
之类的东西,所以它是someContainer[someKeyExpression]
。