首页 > 技术文章 > 聊聊使用NVelocity模板引擎来开发代码生成工具

etong 2017-06-14 14:57 原文

最近把去年给公司做的代码生成工具拿出来看了看以前写的代码,同时也对此工具进行了优化。这款代码生成工具主要作用就是连接数据库获取表名、字段来生成一些简单的代码,来减少体力活,目前可以生成Java代码中的Model、Manager、Impl等文件,当然可以写模板来生成任意文件,到底代码怎么生成呢?今天就来聊聊NVelocity模板引擎。

QQ浏览器截屏未命名.png

NVelocity功能非常强大,像很多的模板引擎一样,以特定的语法编写好模板,然后为模板提供数据源,最终就会渲染生成出想要文件,可以生成html、cs、java等文件,任何文件都可以生成,只需要配置写好固定的生成模板即可。目前公司这个代码生成工具连接数据库之后,可以修改字段属性最后生成需要的文件,如下图所示。

QQ浏览器截屏未命名1.png

QQ浏览器截屏未命名2.png

废话不多说了,开始吧,NVelocity怎么生成代码?Nvelocity下载地址:http://www.zhaodll.com/dll/n/201209/223477.html 找到NVELOCITY这一项进行下载即可。

 

一个简单示例来看看Nvelocity怎么用?

      因为是Demo做的比较粗糙,能说明问题即可。新建一个Application,名称随便取,然后在项目中添加Nvelocity的引用, 然后在项目里,添加一个文件夹并且命名为template,作为存放模板的目录,这与上面代码里设置的模板目录要对应一致,添加一个文件夹并且命名为Files,作为存放模板生成对应的文件。

QQ浏览器截屏未命名3.png

然后加入下面的代码:

 1  VelocityEngine velocityEngine = new VelocityEngine();
 2             ExtendedProperties props = new ExtendedProperties();
 3             props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
 4             //props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, HttpContext.Current.Server.MapPath(templatDir);
 5             props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, path);
 6             //props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Path.GetDirectoryName(HttpContext.Current.Request.PhysicalPath));
 7             props.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
 8             props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");
 9             //模板的缓存设置
10             props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true);              //是否缓存
11             props.AddProperty("file.resource.loader.modificationCheckInterval", (Int64)30);    //缓存时间(秒)
12             velocityEngine.Init(props);
13             //为模板变量赋值
14             VelocityContext context = new VelocityContext();
15             context.Put("Time", "20170613");
16             context.Put("Title", "模板生成");
17             context.Put("Body", "内容");
18             //  Template template = velocityEngine.GetTemplate(@"D:\ProgrammingFolder\C#\NVelocityDemo\NVelocityDemo\bin\Debug\Template");
19             //从文件中读取模板
20             Template template = velocityEngine.GetTemplate("\\Value.vm");
21             //合并模板
22             using (StreamWriter writer = new StreamWriter(@"D:\ProgrammingFolder\C#\NVelocityDemo\NVelocityDemo\Files\123.java", false))
23             {
24                 template.Merge(context, writer);
25             }

 

这是后台代码,还要加入模板代码:

    <p>$Title</p>

    <p>$Time</p>

    <p>$Body</p>

 结果展示:

QQ浏览器截屏未命名4.png
其实就是这么简单,NVelocity还可以将对象绑定进去,和上面context.Put("Time", "20170613");类似,只不过将"20170613"换为对象即可。所以说,想生成什么模板都可以满足。值得注意的是,NVelocity写模板的时候有固定的语法,语法去网上搜一下看看即可。

推荐阅读