2013-05-27 187 views
0

我是freemarker的初学者,我想用它来生成一些重复的代码。Freemarker:嵌套模板

从一个简单的类像这样的:

public class Point { 
    private Integer x; 
    private Integer y; 
    private String name; 
} 

我需要的,每个属性,产生线是这样的:

ValueProvider<Point,Integer> x(); 
ValueProvider<Point,Integer> y(); 
ValueProvider<Point,String> name(); 

要做到这一点,我有这个简单的模板:

ValueProvider<${clazz},${attrType}> ${attrName}(); 

然后,我想要生成一个完整的类,如下所示:

public final class PointValueProviders { 

    public interface PointPropertyAccess extends PropertyAccess<Point>{ 
    ValueProvider<Point,Integer> x(); 
    ValueProvider<Point,Integer> y(); 
    ValueProvider<Point,String> name(); 
    } 

    public static final PointPropertyAccess POINT_PA= GWT.create(PointPropertyAccess.class); 

    private PointValueProviders(){} 

}; 

对于这一点,我有一个问题:我不知道如何运用小模板的时间未定数量在一个更大的模板,像这样的:

public final ${clazz}ValueProviders { 

    public interface ${clazz}PropertyAccess extends PropertyAccess<${clazz}>{ 

    //Here, How do I tell freemarker to use the small template??? 

    //ValueProvider<${clazz},${attrType}> ${attrName}(); 
    //ValueProvider<${clazz},${attrType}> ${attrName}(); 
    //ValueProvider<${clazz},${attrType}> ${attrName}(); 
    //ValueProvider<${clazz},${attrType}> ${attrName}(); 
    //etc.. 

    } 

    public static final ${clazz}PropertyAccess ${clazzUpperCase}_PA= GWT.create(${clazz}PropertyAccess.class); 

    private ${clazz}ValueProviders(){} 

}; 

任何想法?

回答

1

模板将显示您提供给他们的一些数据。所以重要的问题是,该模板将如何知道要输出的三个三元组:class/attrType/attrName你应该通过它提供的人的名单,让我们称之为props,然后只需用循环

<#list props as prop> 
    ValueProvider<${prop.clazz},${prop.attrType}> ${prop.attrName}(); 
</#list> 

否则创建可重用的小模板,要么使用#macro(这个人是更灵活)或#include。看到他们在FreeMarker Manual

+0

我将解决方案与列表一起使用。我在数据模型中添加了一个Entry <“props”,List >>,然后我使用了你的模板。它工作很好:) –