上次我说想自己做个解析Java代码模板的东西,不过实际测试过程中,做的效果不太理想,看了一下MybatisPlus的代码生成器源码,发现了ibeetl,velocity,等模板引擎,都大概学习了一下。最终打算使用velocity来做代码生成。
我把它安装到了maven大概效果算是实现了,不过因为前期没有分析,导致后面写的不太好,代码就不放出来了,实在写的不怎么样。这里只展示一下制作过程中遇到的问题
velocity简单使用
依赖
<dependency>
<artifactId>velocity</artifactId>
<groupId>org.apache.velocity</groupId>
<version>1.7</version>
</dependency>
模板文件
#foreach($name in $list) ##循环
<h1>$name</h1>## $取值
#end
#if($name) ##类似js python的判断
$name
#end
#include("src/main/resources/template/Test.vm") ##可以包含多个直接包含不解析
#parse("src/main/resources/template/Test.vm") ##一次只包含一个递归解析
#set($ok='OKKK') ##定义变量
$ok
#macro(test $ok)##定义宏 第一个名字 后面 参数
$ok
#end
#test('asdsadasd')##使用宏
#if($aaa)
OKKKK
#else ##也有 elseif
NNNNNNNNNN
#end
是德国VS的
执行代码
// 初始化模板引擎
VelocityEngine ve = new VelocityEngine();
// 配置引擎上下文对象 并设置变量
VelocityContext ctx = new VelocityContext();
ctx.put("list","sdgfsdgf,rgtrh,sdfsdgerg,sdgesgfdf,gdgdrgdth,dfgdf".split(","));
ctx.put("name","东方化工地方韩国");
// 加载模板文件 并指定编码 必须指定编码否则中文乱码
Template template = ve.getTemplate("src/main/resources/template/User.vm","utf-8");
StringWriter sw = new StringWriter();
// 渲染模板 到输出流
template.merge(ctx, sw);
System.out.print(sw.toString());
解决打包后vm模板文件找不到的问题
velocityEngine.setProperty("resource.loader", "class");
velocityEngine.setProperty("class.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
//推荐使用类资源加载器 开发或打成jar包都没有问题
velocityEngine.init();//设置并应用 类资源加载器
获取数据库元数据主键等信息
// 获取连接信息 新版本无需再Class.forName("");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zzu","root", "123456");
DatabaseMetaData metaData = connection.getMetaData();//获取连接元数据
// 都填数据库名 表
ResultSet resultSet = metaData.getPrimaryKeys("zzu", "zzu", "cher");
// 都填数据库名 表 列 指定为null都会统配
ResultSet columns = metaData.getColumns("zzu", "zzu", "cher", null);
在Velocity绑定常用的函数方便使用
编写类继承Directive
public class MyTest extends Directive {//必须继承 Directive类
@Override//返回该函数的调用名称
public String getName() {
return "aaaa";
}
// BLOCK LINE 返回是作用行代码块还是 块代码 (里面是否可以包裹普通内容对象)
@Override
public int getType() {
return LINE;
}
@Override
public boolean render(InternalContextAdapter context, Writer writer, Node node)
throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException {
Object name = context.get("name");//获取全局对象信息
writer.write("HelloWorld");//用于向页面输出内容
Object value = node.jjtGetChild(0).value(context);//获取对应输入参数等信息
return true;//返回是否渲染成功
}
}
配置
VelocityEngine ve = new VelocityEngine();
//加载整个配置文件
//ve.init("E:\\IDEA\\MyNewTest3\\src\\main\\resources\\velocity.properties");
ve.loadDirective("velocty.extend.MyTest");//加载一个 写的是全类名
配置文件(可以写多个使用,分割多个)
userdirective=velocty.extend.MyTest
使用
首字母大小写问题
public String upperCaseFrist(String name){
char[] chars = name.toCharArray();
//chars[0]^=' ';//大小写互转 chars[0]|=' ';//全部变为小写 chars[0]&='_';//全部转换为大写
chars[0]&='_';
return new String(chars);
}
这个项目写的比较失败,不过还是记录一下,方便给其他有该想法的人一些建议。