freemarker程式碼生成

dengxm發表於2009-07-09

程式碼生成

用一事例講解程式碼生成

1. 首先寫一個類,如TitanPluginExporter 讓其繼承GenericExporter類。在該類中有一個init方法,該方法的作用是設定模板的路徑和生成檔案的型別。

public class TitanPluginExporter extends GenericExporter {

protected void setupContext() {

super.setupContext();

}

public void doStart() {

super.doStart();

}

protected void init() {

setTemplateName("templates/config/generation/titanplugin_xml.ftl");

setFilePattern("{package-name}/{class-name}.xml");

}

public TitanPluginExporter() {

init();

}

}

2. GenericExporter類繼承了AbstractExporter類,在該類中有一個方法

protected void exportPOJO(Map additionalContext) {

TemplateProducer producer = new TemplateProducer(getTemplateHelper(),

getArtifactCollector());

WebprojectVO webprojectVO = StaitcVO.getWebprojectVO();

additionalContext.put("webproject", StaitcVO.getWebprojectVO());

if (templateName == "templates/config/generation/webproject_project.ftl") {

producer.produce(additionalContext, getTemplateName(), new File(

getOutputDirectory(), resolve("", "")), templateName);

}

if (templateName == "templates/config/generation/webproject_classpath.ftl") {

producer.produce(additionalContext, getTemplateName(), new File(

getOutputDirectory(), resolve("", "")), templateName);

}

if (templateName == "templates/config/generation/titanplugin_xml.ftl") {

producer.produce(additionalContext, getTemplateName(), new File(

getOutputDirectory(), resolve("titanplugin", "")), templateName);

}

}

該方法的作用是判斷是否是所要生成檔案所使用模板,如果是為所要生成的檔案設定包名和檔名。

3. 按照freemarker的規則,去寫templates/config/generation/titanplugin_xml.ftl模板

${webproject.getDomainName()} #if>"/>

4. 本例是結合了嚮導,所以在TitanNewWizard類的performFinish()中,寫入

Exporter projectExporter = new ProjectExporter();

projectExporter.setOutputDirectory(folder);

webprojectVO.setWebprojectName(projectName);

webprojectVO.setDomainName(domainName);

Exporter classpathExporter = new ClasspathExporter();

classpathExporter.setOutputDirectory(folder);

Exporter titanpluginExporter = new TitanPluginExporter();

titanpluginExporter.setOutputDirectory(folder);

List exporters = new ArrayList();

exporters.add(0, projectExporter);

exporters.add(1, classpathExporter);

exporters.add(2, titanpluginExporter);

for (int i = 0; i < exporters.size(); i++) {

((Exporter) exporters.get(i)).start();

}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13726712/viewspace-608777/,如需轉載,請註明出處,否則將追究法律責任。

相關文章