FreeMarker应用一例——生成Java代码

对FreeMarker而言,无非是“Template + data-model = output”。

这里,假设我们所要生成的Java代码,即“output”如下:

package com.cs.qdog.swift.objects;

public class F32B {

    private Double amount;
    private String currency;

    public Double getAmount() {
        return amount;
    }

    public void setAmount(Double amount) {
        this.amount = amount;
    }

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }
}

 

其中,类名、属性都属于“data-model”,其可用树形结构表现如下:

(root)

|

+- class = “F32B”

|

|- properties

|   |

|   +- currency

|   |   |

|   |   +- name = “currency”

|   |   |

|   |   +- type = “String”

|   |

|   +- amount

|   |   |

|   |   +- name = “amount”

|   |   |

|   |   +- type = “Double”

那么,则可使用如下“Template”:

package com.cs.qdog.swift.objects;

public class ${class} {

  <#list properties as prop>
    private ${prop.type} ${prop.name};
  </#list>

  <#list properties as prop>
    public ${prop.type} get${prop.name?cap_first}(){
      return ${prop.name};
    }
    public void set${prop.name?cap_first}(${prop.type} ${prop.name}){
      this.${prop.name} = ${prop.name};
    }
  </#list>


}

 

 

 

最后,将FreeMarker文档中的例子改动一下,测试生成“output”的Java程序如下:

package com.cs.qdog.swift.objects;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class GenObjects {

    public static void main(String[] args) throws IOException,
            TemplateException {

        /* ------------------------------------------------------------------- */
        /* You usually do it only once in the whole application life-cycle: */

        /* Create and adjust the configuration */
        Configuration cfg = new Configuration();
        cfg.setDirectoryForTemplateLoading(new File(
                "D:/Temp/EclipseWorkSpace/GenSwiftFields/templates"));
        cfg.setObjectWrapper(new DefaultObjectWrapper());

        /* ------------------------------------------------------------------- */
        /* You usually do these for many times in the application life-cycle: */

        /* Get or create a template */
        Template temp = cfg.getTemplate("SwiftFieldClass.ftl");

        /* Create a data-model */
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("class", "F32B");
        Collection<Map<String, String>> properties = new HashSet<Map<String, String>>();
        root.put("properties", properties);

        /* subfield 1: currency */
        Map<String, String> currency = new HashMap<String, String>();
        currency.put("name", "currency");
        currency.put("type", "String");
        properties.add(currency);

        /* subfield 2: amount */
        Map<String, String> amount = new HashMap<String, String>();
        amount.put("name", "amount");
        amount.put("type", "Double");
        properties.add(amount);

        /* Merge data-model with template */
        Writer out = new OutputStreamWriter(System.out);
        temp.process(root, out);
        out.flush();
    }

}

 

 

 

 

 

 

 

 

 

 

 

posted @ 2010-02-24 11:26  蟋蟀的草坪  阅读(1468)  评论(2编辑  收藏  举报