代码生成器的步骤

代码生成器可以实现快速开发

如果添加部门模型,复制IDepartmentService,修改类名,ctrl+f,进行人工替换

代码生成器就是先定义好模板,然后使用代码自动修改类名,进行名称的自动替换

 

关键:先备份一下项目

 

1.那些模型需要生成代码:先用一个临时模型Dept,进行测试

2.有那些模板要生成:添加类或者jsp,xml,js

3.上面的面板生成到那个文件夹

 

 

4.定义一下常量,规定文件夹的位置

  格式:全部都是以相对位置开始,前面没有/

        以/结尾

5.外循环:模型数组

6.内循环:模板或者文件夹

7.Velocity上下文

8.添加数据到Velocity上下文:大小写

9.获取模板

10.实例化File对象,打印输出绝对路径:步骤11之后

11.处理特殊的文件名称或者位置

12.实例化FileWriter

13.合并模板,关闭流

14.创建父目录

15.如果已经存在的文件,默认是不生成的,防止覆盖,千万不要用Employee来测试

 

 

package cn.itsource.pss;

import java.io.File;
import java.io.FileWriter;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.junit.Test;

public class CreateCodeTest {
    // 15.如果已经存在的文件,默认是不生成的,防止覆盖,千万不要用Employee来测试
    // 规则flag = false,不覆盖,
    // 规则flag = true,覆盖,
    private boolean flag = false;

    // 1.定义路径固定值
    // *********************规则:路径前面不要写/,后面结尾必须写/
    private String SRC = "src/main/java/";
    // 容易写错的地方:不能包路径,必须是文件路径
    private String PACKAGE = "cn/itsource/pss/";
    private String RESOURCES = "src/main/resources/";
    private String TEST = "src/test/java/";
    private String WEBAPP = "src/main/webapp/";

    // 2.定义那些domain需要生成代码
    // private String[] domains = { "Department" };
    private String[] domains = { "Role", "Permission" };
    // 3.定义模板的名称
    private String[] templates = { "Service.java", "ServiceImpl.java", "Query.java", "Action.java", "ServiceTest.java",
            "hbm.xml", "Context.xml", "domain.js", "list.jsp", "input.jsp" };
    // 4.定义模板对应生成文件的位置
    private String[] files = { SRC + PACKAGE + "service/", SRC + PACKAGE + "service/impl/", SRC + PACKAGE + "query/",
            SRC + PACKAGE + "web/action/", TEST + PACKAGE + "service/", RESOURCES + PACKAGE + "domain/",
            RESOURCES + "manager/", WEBAPP + "js/model/", WEBAPP + "WEB-INF/views/", WEBAPP + "WEB-INF/views/" };

    @Test
    public void create() throws Exception {
        if (templates.length != files.length) {
            throw new RuntimeException("模板!=模板对应生成文件");
        }
        // 实例化Velocity上下文对象
        VelocityContext context = new VelocityContext();
        // 5.外循环
        for (int i = 0; i < domains.length; i++) {
            // 准备数据,类似于struts放入值栈:String getText(){ return "xxxx"}
            context.put("domainEntity", domains[i]);
            // 获取domain模型首字母小写
            String lowerDomainEntity = domains[i].substring(0, 1).toLowerCase() + domains[i].substring(1);
            context.put("lowerDomainEntity", lowerDomainEntity);
            // 6.内循环
            for (int j = 0; j < templates.length; j++) {
                // src/main/java/cn/itsource/pss/DeptService.java
                File file = new File(files[j] + domains[i] + templates[j]);
                if ("Service.java".equals(templates[j])) {
                    file = new File(files[j] + "I" + domains[i] + templates[j]);
                } else if ("hbm.xml".equals(templates[j])) {
                    file = new File(files[j] + domains[i] + "." + templates[j]);
                } else if ("domain.js".equals(templates[j])) {
                    file = new File(files[j] + lowerDomainEntity + ".js");
                } else if ("list.jsp".equals(templates[j])) {
                    file = new File(files[j] + lowerDomainEntity + "/" + lowerDomainEntity + ".jsp");
                } else if ("input.jsp".equals(templates[j])) {
                    file = new File(files[j] + lowerDomainEntity + "/" + lowerDomainEntity + "_input.jsp");
                }

                // 规则flag = false,不覆盖,
                // 规则flag = true,覆盖,
                // 如果不覆盖并且代码文件已经存在:不需要生成
                if (!flag && file.exists()) {
                    // return;
                    // break;
                    continue; // 结束本次循环,进入下一次循环
                }

                // 打印必须在修改路径之后
                System.out.println(file.getAbsolutePath());

                // 生成没有的路径
                File parentFile = file.getParentFile();
                if (!parentFile.exists()) {
                    parentFile.mkdirs();
                }

                FileWriter writer = new FileWriter(file);
                Template template = Velocity.getTemplate("template/" + templates[j], "UTF-8");
                template.merge(context, writer);
                // 关闭流
                writer.close();
            }
        }
        System.out.println("先刷新工程,没有错误,修改映射文件,运行测试,启动tomcat");

    }
}

 

posted @ 2018-04-17 13:00  兔子只吃窝边草  阅读(395)  评论(0编辑  收藏  举报