FreeMarker之根据模板生成Java代码

FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码"。

比如Java中三层架构,数据访问层,业务逻辑层,表现层,光这三层就出现重复性的增删改查及其相关的界面代码。

如何不写重复的增删改查相关的代码,可以参考我的MP实战系列文章和MyBatis的逆向工程(针对Java相关框架):

mybatis逆向工程之maven工程

MP实战系列(六)之代码生成器讲解

其中MP实战系列(六)之代码生成器讲解 用的是volocity模板引擎。原理与FreeMarker本质上是一致的,这个本质一致,你可以理解为都是基于已有的模板进行代码生成。

下面进入简单示例讲解:

一、导入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>

二、新建com.freemarker.hello.templates包,并在该包下编写模板文件test.ftl

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};
    }

}

三、编写运行生成对应Java代码类

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();
            }
        }
    }

}

四、步骤三成功,刷新(refresh)项目即可,看到com.freemark.hello有一个User类

小结:该示例非常简单,freemarker的强大不足以在此体现,不过该示例对于初学者或者准备研究freemarker的开发者有一定的启示意义。

比如:遵守"DRY原则",对于开发效率的提高,帮助非常大。

原文地址:https://www.cnblogs.com/youcong/p/9420504.html

时间: 2024-08-21 23:28:16

FreeMarker之根据模板生成Java代码的相关文章

[转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:HelloWorld.cs (二) 多文件生成 四.生成数据层实体相关相似代码 (一) 生成准备 (二) 生成实体相关相似代码 生成实体映射配置类 生成实体仓储接口 生成实体仓储实现 五.源码获取 系列导航 一.前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少

使用ant批量将corba的idl文件生成java代码

这次有30多个idl文件需要生成java代码,并且其中有些idl之间相互引用,用命令一个个生成感觉非常反锁,并且容易出问题,看到jacorb中的例子是用ant来生成的,与自己也用ant批量生成了,在这里记录下主要的代码内容,供下次参考. ant的build.xml文件内容如下: <?xml version="1.0"?> <!-- 批量将idl生成java代码 --> <project name="idlBuilder" default

CXF wsdl2java 生成java代码供客户端使用

环境配置:1.下载apache-cxf-2.6.2在环境变量中配置CXF_HOME 值为E:\gavin\cxf\apache-cxf-3.0.0,在PATH中加入%CXF_HOME%\bin2.输入cmd 进入控制窗口,输入wsdl2java看是否配置成功3.参考它的文档看这个工具的具体参数的用法 wsdl2java用法: wsdl2java -p com -d src -all  wsdl -p  指定其wsdl的命名空间,也就是要生成代码的包名-d  指定要产生代码所在目录 -client

Android Layout Binder(在线将XML中View find出来,生成java代码的工具)

废话不多说,这是地址:http://android.lineten.net/layout.php. 有图有真相,例如: 你的XML假如是这样: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fil

axis2处理webservice接口的wsdl文件生成java代码

第一步: 下载axis2,我下载的版本是[axis2-1.6.2-bin.zip],要把文件夹解压 第二步: 打开命令窗口,进入到axis的路径下bin目录 第三步: 执行语句:./wsdl2java.sh -uri 文件.xml(wsdl文件) -o 生成路径 -p 包结构(com.b.c) 就可以在设置的[生成路径]下找到对应[包结构]的java代码 [~/work/axis2-1.6.2/bin]$./wsdl2java.sh -uri 文件.xml(wsdl文件) -o 生成路径 -p 

使用idea和wsdl生成java代码

创建一个简单的java helloworld项目 选择next: 选择java helloworld project next 填写project name finish 2.  创建好项目后 选择项目 右键->webservice->Generate 生成代码配置,填写wsdl路径,包路径,webservice平台(这里我选择的是jax-ws jdk自带的webservice实现方式,不用再下载jar包) 这里我使用的wsdl,是一个天气预报的webservice:http://www.we

拥有complexType的schema生成java代码

1.在d:/xml练习目录下创建一个complexType.xsd文件 <?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ts="http://my.soa.complexType.com/complexTypexsd" targetNamespace=&qu

使用cxf将wsdl生成java代码

先下载安装cxf CXF 项目的主页地址是: http://cxf.apache.org/ 下载地址是: http://cxf.apache.org/download.html 安装成功后找到bin目录下得wsdl2java.bat文件 打开命令串窗口切换到该文件的目录下,执行wsdl2java.bat e:...java 这样子进OK了,在bin目录下就会有生成好的java代码. 路劲这样切换,本人的是在D盘 原文地址:https://www.cnblogs.com/DreamFather/p

cxf将wsdl生成java代码

Apache CXF是一个开源的WebService框架,CXF可以用来构建和开发WebService 环境 win10 下载 官网下载:http://cxf.apache.org/download.html 解压后如下所示: 配置环境变量 新建变量CXF_HOME path变量下添加: %CXF_HOME%\bin 验证 cmd中运行wsdl2java -v,忽略提示,显示版本号则证明配置成功 生成java文件 wsdl2java url 或者 wsdl文件 示例 - 手机归属地webServ