代码生成器的步骤
代码生成器可以实现快速开发
如果添加部门模型,复制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"); } }