淘先锋技术网

首页 1 2 3 4 5 6 7

自制代码生成器原因:

Mybatis自带的自动生成代码,不能自定义,各种命名没法改,不能生成controllerservicejsp等页面

如何写代码生成器模板引擎velocity

Velocity-1.7.jar  模板引擎

commons2jar :模板引擎依赖的类

Guava-27.1-jre.jar :实现对字段名的转换,比如good_name字段,在java类的属性叫goodName,当setGoodName时又变成首字母都大写:GoodName,这个jar可以方便转换                                                                                                      80b2c069ada98e6b350c0b85b473ca717c9.jpg     

代码生成器原理:           

1 )编写一个模板,比如要生成 XXXService.java service 里面所有代码讲模块部分全部用占位符 / 变量名代替。比如 MenuService 改成 ${ modelClass }Service
2 )使用模板引擎,向模板中传递需要的占位符数据,比如 ${ modelClass } ,这次要生成 Menu ,就传 Menu ,下次要建G ood ,就传 Good ,就可以生成出来不同的模块,但代码只写了模板里面的这一遍
3 )通过模板引擎,将替换好的占位符的模板输出为具体的 MenuService.java MenuController.java 甚至是 menu . jsp

开发过程:

引入 jar 包。
新建类 com.xx.code.CodeBuilder ,要有 main 方法,需要单独运行生成代码文件。不走 spring 框架;
编写模板引擎调用代码
0b474ed5f0cdd81d2ab058cdb418147fc56.jpg
service.vm 模板
426ab358800c819d64f40766351bd35d9eb.jpg
com.xx.code.CodeBuilder 生成 MenuService 完整 代码
package com.xx.code;

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;

public class CodeBuilder {
	
	public static void main(String[] args) {
		//new一下他的模板
		VelocityEngine ve = new VelocityEngine();
		//设置模板和输出的代码文件的编码方式
		Properties p = new Properties();
		p.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
		p.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
		p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
		//引擎初始化
		ve.init(p);
		//引入一个模板,通过模板路径
		Template serviceVm = ve.getTemplate("/WebContent/WEB-INF/vm/service.vm");
		//定义占位符变量,给个值
		String modelClass = "Menu";
		String modelName = "menu";
		//生成的代码放置的目录==项目目录
		String rootPath = "F:/企业/shop/";
		//变量放到上下文对象里
		VelocityContext ctx = new VelocityContext();
		ctx.put("modelClass", modelClass);
		ctx.put("modelName", modelName);
		//将占位符数据和模板合并,输出代码文件
		CodeBuilder.merge(serviceVm, ctx, rootPath + "src/com/xx/service/" + modelClass + "Service.java");
		
		Template serviceVmImpl = ve.getTemplate("/WebContent/WEB-INF/vm/serviceImpl.vm");
		CodeBuilder.merge(serviceVmImpl, ctx, rootPath + "src/com/xx/service/" + modelClass + "ServiceImpl.java");
		
		Template daoVm = ve.getTemplate("/WebContent/WEB-INF/vm/dao.vm");
		CodeBuilder.merge(daoVm, ctx, rootPath + "src/com/xx/dao/" + modelClass + "Dao.java");
	}
	private static void merge(Template template,VelocityContext ctx,String path){
	
		PrintWriter writer = null;
		
		try {
			writer = new PrintWriter(path);
			
			template.merge(ctx, writer);
			writer.flush();
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} finally{
			writer.close();
		}
			
	}
}

 

其他的模板类似,我们写一下:serviceImpl.vm  service.vm  dao.vm 62c6083bf2f2125788453f427f5f3934aae.jpg
 

                                     

 

   

转载于:https://my.oschina.net/u/4092798/blog/3042322