实现一个代码自动生成(一):模板引擎Freemarker
目录
- 前言
- 模板引擎FreeMarker 模板引擎是什么?
- FreeMarker是什么?
- FreeMarker如何使用? 加入依赖
- 创建Configuration实例
- 创建数据模型
- 获取模板
- 合并模板和数据
- 整合代码
前言
在现在的开发当中,代码生成已经是必不可少的一个功能,每个公司都会有自己的一套定制的项目骨架,而实现代码自动生成,模板引擎是必不可少的,所以在这篇博客中,将会讲解freemarker在代码生成中所扮演的角色,以及介绍如何在Java项目中使用它!
模板引擎FreeMarker
模板引擎是什么?
模板引擎一般指将通用代码和业务数据分离开来的技术,该技术有多种实现,如置换型、解释型、编译型,如JSP就是其中一种应用非常广泛的模板引擎技术(其本质是一个Servlet,用来生成Html文件)
FreeMarker是什么?
官方文档:
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
简单来讲就是FreeMarker把目标文本分解成了Model、View,然后引擎自身充当了Controller,也就是常见的MVC模式。
FreeMarker通过预先定义好的模板文件(ftl文件),再把如Java对象中的属性进行填充,最后输出目标文件。
FreeMarker如何使用?
FreeMarker不像JSP,需要绑定Servlet才能使用,在Java中我们只需要导入对应的Jar包就可以使用了!接下来会介绍在Maven项目中如何使用FreeMarker。
加入依赖
首先我们先在pom.xml中加入FreeMarker的依赖:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
创建Configuration实例
// step1 创建freemarker.template.Configuration配置实例 Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
创建数据模型
我们可以使用一个String,或者以下的类型的实例充当数据模型,在这里使用了一个自定义的Bean。
使用 java.lang.String 来构建字符串。
使用 java.lang.Number 来派生数字类型。
使用 java.lang.Boolean 来构建布尔值。
使用 java.util.List 或Java数组来构建序列。
使用 java.util.Map 来构建哈希表。
使用自定义的bean类来构建哈希表,bean中的项和bean的属性对应。比如, product 的 price 属性 (getProperty())可以通过 product.price 获取。(bean的action也可以通过这种方式拿到; 要了解更多可以参看 这里)
//创建一个root hash对象,用来装载数据对象 Map<String, Object> root = new HashMap<>(); //将数据对象装载入hash中 root.put("user", new User("Joe",17));
使用到的自定义的User类
//User public class User { private String name; private int age; public String getName() { return name; } public int getAge() { return age; } User(String name, int age) { this.age = age; this.name = name; } }
创建一个模板文件(.ftl文件)
<--! demo.ftl --> <user> <name>user.name</name> <age>user.age</age> </user>
获取模板
获取之前我们创建的demo.ftl模板文件
Template temp = cfg.getTemplate("demo.ftl");
合并模板和数据
我们在了解FreeMarker的开始就知道,数据模型+模板=目标输出,在最后,我们只需要将获取到的模板,和自定义的root hash对象进行绑定,这里会使用到Template的process()方法;
//创建输出流,定义输出的文件 File docFile = new File("demo.xml"); out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile))); //process方法将数据与模板进行绑定,输出到out输出流 temp.process(root, out);
最后我们成功地新建了demo.xml文件!
<--! demo.ftl --> <user> <name>Joe</name> <age>17</age> </user>
整合代码
// 创建freemarker.template.Configuration配置实例 Configuration configuration = new Configuration(Configuration.VERSION_2_3_22); //创建一个root hash对象,用来装载数据对象 Map<String, Object> root = new HashMap<>(); //将数据对象装载入hash中 root.put("user", new User("Joe",17)); //获取模板 Template temp = cfg.getTemplate("demo.ftl"); //创建输出流,定义输出的文件 File docFile = new File("demo.xml"); out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile))); //process方法将数据与模板进行绑定,输出到out输出流 temp.process(root, out);
- 利用KVC写的一个分类实现自动生成模型属性代码
- 用自动生成代码实现数据的持久化
- PHP定时自动生成静态HTML的实现代码
- 一个简单的导弹自动追踪以及实时图片旋转算法,Python-pygame代码实现
- ASPX验证码生成程序(C#代码一个页面实现)
- 去掉asp.net自动生成的垃圾代码的一个类,
- 根据一个大图片自动生成相应小图片的代码
- 一个自动根据xcode中的objective-c代码生成类关系图的神器
- 代码自动生成工具(二)-miniproto的c#库实现
- 记mybatis.generator自动生成代码实现
- 转载:一个根据代码自动生成UML的插件,助你看源码事半功倍
- 为驱动程序添加代码,实现自动生成/dev/下节点
- 文字溢出实现溢出的部分再放入一个新生成的div中具体代码
- Python实现的一个自动售饮料程序代码分享
- 如果公司里有上百个表要做触发器,如果手动写代码的话。很累,所以今天写了一个小程序,自动生成mysql的触发代码。
- mybatis-generator-gui--一个mybatis代码自动生成界面工具
- 个人作业1-实现一个自动生成小学四则运算题目的命令行程序
- 用java实现验证码的生成,以下代码是一个controller,可以直接使用!
- HBuilder的扩展插件开发暴露了一个事实:其实不能实现写一次代码实现跨平台App生成
- access如何用代码在“默认值”里实现自动编号?单据流水号生成问题。