PebbleTemplates 模版引擎使用
PebbleTemplates 是一个类似jinja 的java 模版引擎(受twig启发)支持的能力还是很多的,而且扩展性很不错,比如模版资源加载,模版缓存
自定义扩展。。。。,是一个值得使用的模版引擎
一个s3 loader
- 参考代码
基于了minio client 通过配置指定
public class S3Loader implements Loader<String> {
private MinioClient minioClient;
private String bucket;
public S3Loader(MinioClient minioClient,String bucket) {
this.minioClient = minioClient;
this.bucket=bucket;
}
@Override
public Reader getReader(String cacheKey) {
Reader targetReader = null;
try {
GetObjectResponse response = this.minioClient.getObject(GetObjectArgs.builder().bucket(this.bucket).object(cacheKey).build());
targetReader = new InputStreamReader(response);
} catch (ErrorResponseException e) {
throw new RuntimeException(e);
} catch (InsufficientDataException e) {
throw new RuntimeException(e);
} catch (InternalException e) {
throw new RuntimeException(e);
} catch (InvalidKeyException e) {
throw new RuntimeException(e);
} catch (InvalidResponseException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (ServerException e) {
throw new RuntimeException(e);
} catch (XmlParserException e) {
throw new RuntimeException(e);
}
return targetReader;
}
@Override
public void setCharset(String charset) {
}
@Override
public void setPrefix(String prefix) {
}
@Override
public void setSuffix(String suffix) {
}
@Override
public String resolveRelativePath(String relativePath, String anchorPath) {
return null;
}
@Override
public String createCacheKey(String templateName) {
return templateName;
}
@Override
public boolean resourceExists(String templateName) {
return true;
}
}
- 入口代码
public class App {
public static void main(String[] args) throws IOException {
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://127.0.0.1:9000")
.credentials("minio", "minio123")
.build();
// 推荐基于DelegatingLoader 进行加载,可以支持多种loader
DelegatingLoader delegatingLoader = new DelegatingLoader(Arrays.asList(new S3Loader(minioClient,"demoapp")));
PebbleEngine engine = new PebbleEngine.Builder().loader(delegatingLoader).build();
PebbleTemplate compiledTemplate = engine.getTemplate("home.html");
Map<String, Object> context = new HashMap<>();
context.put("name", "Mitchell");
Writer writer = new StringWriter();
compiledTemplate.evaluate(writer, context);
String output = writer.toString();
System.out.println(output);
}
}
- 参考模版内容
home.html
{% extends "100/base.html" %}
{% block title %} Home {% endblock %}
{% block content %}
<h1> Home </h1>
<p> Welcome to my home page. My name is {{ name }}.</p>
{% endblock %}
base.html
<html>
<head>
<title> 自定义web page {% block title %}{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}{% endblock %}
</div>
<div id="footer">
{% block footer %}
Copyright 2018
{% endblock %}
</div>
</body>
</html>
- 运行效果
s3 参考玩法
简单说明: 通过提供模版管理能力(基于s3 api + 包装),可以将自定义模版以及公共模版访问s3 bucket 不同目录中,模版管理中进行模版片段的组合(可以支持不同的模版入口定义),对于业务为了提升性能,可以添加cache 能力(可以基于redis 以及 local cache 进行多级处理)
说明
PebbleTemplates 的扩展能力很方便,利用PebbleTemplates 灵活的扩展能力,我们可以很好的设计一个基于模版的系统,对于jinja 社区也包含了一个开源的实现(jinjava)当然也包括了支持自定义扩展
参考资料
https://min.io/docs/minio/linux/developers/java/API.html
https://github.com/PebbleTemplates/pebble
https://github.com/rongfengliang/pebbletemplates-learning
https://palletsprojects.com/p/jinja/
https://twig.symfony.com/
https://pebbletemplates.io/
https://github.com/HubSpot/jinjava