FreeMarker之根據模板生成Java代碼

FreeMarker根據模板生成Java代碼,光這句話,你們想必也知道它的應用了,好比流行的DRY原則,該原則的意思,可簡單概述爲"不要寫重複的代碼"。html

好比Java中三層架構,數據訪問層,業務邏輯層,表現層,光這三層就出現重複性的增刪改查及其相關的界面代碼。java

如何不寫重複的增刪改查相關的代碼,能夠參考個人MP實戰系列文章和MyBatis的逆向工程(針對Java相關框架):web

mybatis逆向工程之maven工程apache

MP實戰系列(六)之代碼生成器講解mybatis

其中MP實戰系列(六)之代碼生成器講解 用的是volocity模板引擎。原理與FreeMarker本質上是一致的,這個本質一致,你能夠理解爲都是基於已有的模板進行代碼生成。架構

 

下面進入簡單示例講解:app

 

1、導入maven依賴框架

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.test</groupId>
  <artifactId>freemarket</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
           <dependency>
             <groupId>org.freemarker</groupId>
             <artifactId>freemarker</artifactId>
             <version>2.3.23</version>
         </dependency>
        

    </dependencies>
    <build>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <!-- <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
                </configuration>
            </plugin> -->

        </plugins>
        <finalName>${project.artifactId}</finalName>
    </build>
</project>

 

2、新建com.freemarker.hello.templates包,並在該包下編寫模板文件test.ftlwebapp

package ${classPath};

public class ${className} {
    
   private Integer ${Id};
   private String ${userName};
   private String ${password};
   
    
    
    public Integer get${Id}(){
    
        return ${Id};
    }
    
    public void set${Id}(Integer ${Id}){
    
        this.${Id}=${Id};
    }
    
    public String get${userName}(){
        return ${userName};
    }

    public void set${userName}(String ${userName}){
        this.${userName}=${userName};
        
    }
    
    public String get${password}(){
        return ${password};
    }
    
    public void set${password}(String ${password}){
        this.${password}=${password};
    }

}

 

3、編寫運行生成對應Java代碼類maven

package com.freemark.hello;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;


public class FreemarkerDemo {
    
    private static final String TEMPLATE_PATH = "src/main/java/com/freemark/hello/templates";
    private static final String CLASS_PATH = "src/main/java/com/freemark/hello";
    
    public static void main(String[] args) {
        // step1 建立freeMarker配置實例
        Configuration configuration = new Configuration();
        Writer out = null;
        try {
            // step2 獲取模版路徑
            configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));
            // step3 建立數據模型
            Map<String, Object> dataMap = new HashMap<String, Object>();
            dataMap.put("classPath", "com.freemark.hello");
            dataMap.put("className", "User");
            dataMap.put("Id", "Id");
            dataMap.put("userName", "userName");
            dataMap.put("password","password");
            // step4 加載模版文件
            Template template = configuration.getTemplate("test.ftl");
            // step5 生成數據
            File docFile = new File(CLASS_PATH + "\\" + "User.java");
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
            // step6 輸出文件
            template.process(dataMap, out);
            System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^User.java 文件建立成功 !");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != out) {
                    out.flush();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

}

 

4、步驟三成功,刷新(refresh)項目便可,看到com.freemark.hello有一個User類

 

小結:該示例很是簡單,freemarker的強大不足以在此體現,不過該示例對於初學者或者準備研究freemarker的開發者有必定的啓示意義。

好比:遵照"DRY原則",對於開發效率的提升,幫助很是大。

相關文章
相關標籤/搜索