Java Freemarker:嵌套模板

Java Freemarker:嵌套模板,java,freemarker,Java,Freemarker,我是freemarker的初学者,我想用它来生成一些重复的代码 从这样一个简单的类: public class Point { private Integer x; private Integer y; private String name; } public final ${clazz}ValueProviders { public interface ${clazz}PropertyAccess extends PropertyAccess<${clazz}>

我是freemarker的初学者,我想用它来生成一些重复的代码

从这样一个简单的类:

public class Point {
  private Integer x;
  private Integer y;
  private String name;
}
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(){}

};
我需要为每个属性生成如下行:

ValueProvider<Point,Integer> x();
ValueProvider<Point,Integer> y();
ValueProvider<Point,String> name();
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(){}

};
ValueProvider x();
valuey();
ValueProvider名称();
为了实现这一点,我有一个简单的模板:

ValueProvider<${clazz},${attrType}> ${attrName}();
ValueProvider${attrName}();
然后,我想生成一个完整的类,如下所示:

ValueProvider<Point,Integer> x();
ValueProvider<Point,Integer> y();
ValueProvider<Point,String> name();
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(){}

};
公共最终类PointValueProviders{
公共接口点PropertyAccess扩展了PropertyAccess{
ValueProvider x();
valuey();
ValueProvider名称();
}
公共静态final PointPropertyAccess POINT_PA=GWT.create(PointPropertyAccess.class);
私有PointValueProviders(){}
};
对于这一点,我有一个问题:我不知道如何在这样一个较大的模板中应用小模板无数次:

public class Point {
  private Integer x;
  private Integer y;
  private String name;
}
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(){}

};
public final${clazz}ValueProviders{
公共接口${clazz}PropertyAccess扩展了PropertyAccess{
//在这里,我如何告诉freemarker使用小模板???
//ValueProvider${attrName}();
//ValueProvider${attrName}();
//ValueProvider${attrName}();
//ValueProvider${attrName}();
//等等。。
}
公共静态final${clazz}PropertyAccess${clazzhuppercase}\u PA=GWT.create(${clazz}PropertyAccess.class);
私有${clazz}ValueProviders(){}
};

有什么想法吗?

模板用于显示您提供给他们的一些数据。因此,重要的问题是,模板如何知道要输出的
/
属性类型
/
属性名称
三元组?您应该提供一个列表,我们称之为
道具
,然后用

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

ValueProvider${prop.attrName}();

否则,要创建可重用的小模板,可以使用
#宏
(这一个更灵活)或
#包含
。在中查看它们。

模板用于显示您提供给它们的一些数据。因此,重要的问题是,模板如何知道要输出的
/
属性类型
/
属性名称
三元组?您应该提供一个列表,我们称之为
道具
,然后用

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

ValueProvider${prop.attrName}();

否则,要创建可重用的小模板,可以使用
#宏
(这一个更灵活)或
#包含
。在中查看它们。

我将解决方案与列表一起应用。我在数据模型中添加了一个条目,然后使用了您的模板。它工作得很好:)我用列表应用了解决方案。我在数据模型中添加了一个条目,然后使用了您的模板。效果不错:)