自定义代码生成器

代码生成器的原理

(1)编写一个模板,比如要生成XXXService.java,service里面所有代码讲模块部分全部用占位符/变量名代替。比如MenuService改成${modelClass}Service

(2)使用模板引擎,向模板中传递需要的占位符数据,比如${modelClass},这次要生成Menu,就传Menu,下次要建good,就传Good,就可以生成出来不同的模块,但代码只写了模板里面的这一遍

(3)通过模板引擎,将替换好的占位符的模板输出为具体的MenuService.java、MenuController.java甚至是menu.jsp

步骤

1.导包

2.新建类com.zq.code.CodeBuilder,要有main方法,需要单独运行生成代码文件。不走spring框架;

package com.zq.code;

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 = "C:/Users/Administrator/Desktop/shop/"; 
		
		//变量放到上下文对象里
		VelocityContext ctx = new VelocityContext();
		ctx.put("modelClass", modelClass);
		ctx.put("modelName", modelName);
				
		//将占位符数据和模版合并,输出代码文件
		CodeBuilder.merge(serviceVm, ctx, rootPath +"src/com/zq/service/" + modelClass +"Service.java");
		
		//service实现类的
		Template serviceImplVm = ve.getTemplate("/WebContent/WEB-INF/vm/serviceImpl.vm");
		CodeBuilder.merge(serviceImplVm, ctx, rootPath +"src/com/zq/service/" + modelClass +"ServiceImpl.java");
		
		//dao的
		Template daoVm = ve.getTemplate("/WebContent/WEB-INF/vm/dao.vm");
		CodeBuilder.merge(daoVm, ctx, rootPath +"src/com/zq/dao/" + modelClass +"Dao.java");
		
		System.out.println("成功");
	}
	
	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(Exception e){
			e.printStackTrace();
		}finally{
			writer.close();
		}
	}
}

3.写service.vm模板(在WEB-INF中新建vm文件夹)

package com.zq.service;

import java.util.List;
import com.github.pagehelper.PageInfo;
import com.zq.model.${modelClass};

public interface ${modelClass}Service {
	/**
	 * 带有分页的列表查询
	 * @param pageNum
	 * @param pageSize
	 * @param ${modelClass}
	 * @return
	 */
	public PageInfo<${modelClass}> list(Integer pageNum,Integer pageSize,${modelClass} ${modelName});
	
	/**
	 * 没有分页的列表查询
	 * @param pageNum
	 * @param pageSize
	 * @param ${modelClass}
	 * @return
	 */
	public List<${modelClass}> list(${modelClass} ${modelName});
	public void create(${modelClass} ${modelName});
	public void update(${modelClass} ${modelName});
	public void delete(Integer id);
	public ${modelClass} findById(Integer id);
}

其他的模板类似(源代码copy进来把User替换为${modelClass},user替换为${modelName}),再写:serviceImpl.vm  controller.vm  dao.vm

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值