文章目录
- 前言
- 编写引擎类:JsonTemplateEngine
- 编写模板类:CustomTemplate
- 编写测试代码
- 测试json文件
- 测试类
前言
由于百度搜索json模板引擎,推荐的都是一些freemarker之类的,需要引入其他的依赖,而且在编写json模板的时候使用${}
进行格式化的时候会把{}
当作json的格式进行格式化,导致json模板非常难看。
所以笔者基于hutool的TemplateUtil进行扩展,通过实现了TemplateEngine接口,CustomTemplate继承AbstractTemplate抽象类,来实现个性化的模板转换。
并且按照这样的写法,还可以自定义扩展其他的模板引擎格式,如${}
、$$
、#{}
等
编写引擎类:JsonTemplateEngine
package com.hx.core.jsonTemplate;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
/**
* 自定义模板引擎——引擎类
*/
public class JsonTemplateEngine implements TemplateEngine {
TemplateConfig cfg;
private static final String PREFIX = "$";
private static final String SUFFIX = "$";
public JsonTemplateEngine() {
}
public JsonTemplateEngine(TemplateConfig cfg) {
this.init(cfg);
}
@Override
public TemplateEngine init(TemplateConfig config) {
if (null == config) {
config = TemplateConfig.DEFAULT;
}
this.cfg = config;
return this;
}
@Override
public Template getTemplate(String resource) {
if (null == this.cfg) {
this.init(TemplateConfig.DEFAULT);
}
StringBuilder stringBuilder = null;
String path = this.cfg.getPath() + "\\" + resource;
switch (this.cfg.getResourceMode()) {
case CLASSPATH:
stringBuilder = new StringBuilder(ResourceUtil.readStr(path, this.cfg.getCharset()));
break;
case FILE:
stringBuilder = new StringBuilder(ResourceUtil.readStr(path, this.cfg.getCharset()));
break;
case WEB_ROOT:
throw new RuntimeException("暂不支持的模板加载类型");
case STRING:
stringBuilder = new StringBuilder(resource);
break;
default:
throw new RuntimeException("暂不支持的模板加载类型");
}
return new CustomTemplate(stringBuilder, PREFIX, SUFFIX);
}
}
编写模板类:CustomTemplate
package com.hx.core.jsonTemplate;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.template.AbstractTemplate;
import java.io.*;
import java.util.Map;
/**
* 自定义模板引擎——模板类
*/
public class CustomTemplate extends AbstractTemplate implements Serializable {
private StringBuilder stringBuilder;
private String prefix;
private String suffix;
public CustomTemplate(StringBuilder stringBuilder, String prefix, String suffix) {
this.stringBuilder = stringBuilder;
this.prefix = prefix;
this.suffix = suffix;
}
@Override
public void render(Map<?, ?> bindingMap, Writer writer) {
for (Object key : bindingMap.keySet()) {
String keyStr = StrUtil.concat(false, prefix, String.valueOf(key), suffix);
String valStr = String.valueOf(bindingMap.get(key));
int startIndex = stringBuilder.indexOf(keyStr);
if (startIndex <= 0) continue;
int endIndex = startIndex + keyStr.length();
stringBuilder.replace(startIndex, endIndex, valStr);
}
try {
writer.append(stringBuilder.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void render(Map<?, ?> bindingMap, OutputStream out) {
// TODO
}
}
编写测试代码
测试json文件
{
"name": $name$,
"text": $text$
}
测试类
package com.hx.core;
import cn.hutool.core.lang.Dict;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
import cn.hutool.extra.template.TemplateUtil;
import com.hx.core.jsonTemplate.JsonTemplateEngine;
public class Test1 {
public static void main(String[] args) {
//自动根据用户引入的模板引擎库的jar来自动选择使用的引擎
//TemplateConfig为模板引擎的选项,可选内容有字符编码、模板路径、模板加载方式等,默认通过模板字符串渲染
TemplateConfig config = new TemplateConfig();
config.setCustomEngine(JsonTemplateEngine.class);
TemplateEngine templateEngine = TemplateUtil.createEngine(config);
Template template = templateEngine.getTemplate("hello $name$");
//Dict本质上为Map,此处可用Map
String result = template.render(Dict.create().set("name", "Huathy"));
System.out.println("result = " + result);
// 使用方式二
TemplateConfig templateConfig = new TemplateConfig("", TemplateConfig.ResourceMode.CLASSPATH);
TemplateEngine templateEngine2 = new JsonTemplateEngine(templateConfig);
Template template2 = templateEngine2.getTemplate("test.json");
String res2 = template2.render(Dict.create()
.set("name", "Huathy")
.set("text","这种方式的json文件格式化时不会乱码"));
System.out.println("res2 = " + res2);
}
}
输出: