java吧 关注:1,273,255贴子:12,785,330
  • 3回复贴,共1

JAVA实用技术分享 1 代码生成

只看楼主收藏回复

在实际写代码的过程中,不同业务模块的代码存在大量的相似性,往往只需要改动一个模块代码中的部分字段,就能满足另一个模块的需求,比如列表的查询,不同的列表区别只是字段的不同,然而,为了模块的独立性,这些代码不能公用,每一个模块都必须包含这些代码,虽然CV大法好用,但代码经过CV还是需要有所改动,还是比较耗时耗力。
此次介绍的代码生成功能,引用了免费的模板引擎——freeMarker ,它是一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
这里简单介绍一下如何使用freeMarker ,来生成我们想要的代码。
1:首先,准备好代码的模板文件,其中<#list data as map></#list>标签,这是开始读数据的标签,我们之后会传我们自己的数据“data”进入模板,文件用记事本写好后改成.ftl后缀。
简单翻译一下模板中两种标签的含义
"data as map"->data 的别名是map
"${map["BODY"]?if_exists}"->如果map.get("BODY")存在的话,此处传入map.get("BODY"),否则为空

2:使用freeMarker 生成代码
package createWord;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
public class ProCode {
private static Configuration cfg;
static {
// 创建一个Configuration实例,并 初始化FreeMarker配置
try {
cfg = new Configuration();
cfg.setObjectWrapper(new DefaultObjectWrapper());
cfg.setDefaultEncoding("UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void proCodeFun(Map<String, Object> dataMap){
Template t = null;
try {
cfg.setDirectoryForTemplateLoading(new File("C:/Users/Chensq/Desktop"));//存放ftl文件的路径
t = cfg.getTemplate("code.ftl");//ftl文件名称
} catch (IOException e1) {
e1.printStackTrace();
}
File outFile = new File("C:/Users/Chensq/Desktop/text.html");//生成的代码文件的存放路径
if (!outFile.exists()) {
try {
outFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
t.process(dataMap, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
Map<String, Object> dataTempMap = new HashMap<String, Object>();
dataTempMap.put("TITLE", "这是标题");
dataTempMap.put("BODY", "这是内容");
dataList.add(dataTempMap);
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("data", dataList);
proCodeFun(dataMap);
}
}
这里的main方法里传入了我们自定义的内容,结合模板,可以看到这些内容对应模板中的哪个位置,允许这段代码,可以看到在桌面生成了text.html文件,可以看到,代码成功生成了


你学会啦吗~~


IP属地:广东1楼2021-07-20 16:42回复
    我觉得挺不错的,可以在我的博客网站上写吗
    q群462535592


    IP属地:上海来自Android客户端2楼2021-07-20 17:27
    收起回复