diff --git a/CHANGELOG.md b/CHANGELOG.md
index f528a27a2..602317ed0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
# 5.7.21 (2022-01-20)
### 🐣新特性
+* 【extra 】 增加jetbrick模板支持
### 🐞Bug修复
-------------------------------------------------------------------------------------------------------------
diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml
index 15945e1ce..4d289fbd1 100644
--- a/hutool-extra/pom.xml
+++ b/hutool-extra/pom.xml
@@ -119,6 +119,12 @@
2.6.0
true
+
+ com.github.subchen
+ jetbrick-template
+ 2.1.10
+ true
+
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
new file mode 100755
index 000000000..f6b3f24ed
--- /dev/null
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
@@ -0,0 +1,109 @@
+package cn.hutool.extra.template.engine.jetbrick;
+
+import cn.hutool.extra.template.Template;
+import cn.hutool.extra.template.TemplateConfig;
+import cn.hutool.extra.template.TemplateEngine;
+import jetbrick.template.JetEngine;
+
+import java.util.Properties;
+
+/**
+ * Jetbrick模板引擎封装
+ * 见:https://github.com/subchen/jetbrick-template-2x
+ *
+ * @author looly
+ * @since 5.7.21
+ */
+public class JetbrickEngine implements TemplateEngine {
+
+ private JetEngine engine;
+
+ // --------------------------------------------------------------------------------- Constructor start
+ /**
+ * 默认构造
+ */
+ public JetbrickEngine() {}
+
+ /**
+ * 构造
+ *
+ * @param config 模板配置
+ */
+ public JetbrickEngine(TemplateConfig config) {
+ init(config);
+ }
+
+ /**
+ * 构造
+ *
+ * @param engine {@link JetEngine}
+ */
+ public JetbrickEngine(JetEngine engine) {
+ init(engine);
+ }
+ // --------------------------------------------------------------------------------- Constructor end
+
+
+ @Override
+ public TemplateEngine init(TemplateConfig config) {
+ init(createEngine(config));
+ return this;
+ }
+
+ /**
+ * 初始化引擎
+ * @param engine 引擎
+ */
+ private void init(JetEngine engine){
+ this.engine = engine;
+ }
+
+ @Override
+ public Template getTemplate(String resource) {
+ if(null == this.engine){
+ init(TemplateConfig.DEFAULT);
+ }
+ return JetbrickTemplate.wrap(engine.getTemplate(resource));
+ }
+
+ /**
+ * 创建引擎
+ *
+ * @param config 模板配置
+ * @return {@link JetEngine}
+ */
+ private static JetEngine createEngine(TemplateConfig config) {
+ if (null == config) {
+ config = TemplateConfig.DEFAULT;
+ }
+
+ Properties props = new Properties();
+ props.setProperty("jetx.input.encoding", config.getCharsetStr());
+ props.setProperty("jetx.output.encoding", config.getCharsetStr());
+ props.setProperty("jetx.template.loaders", "$loader");
+
+ switch (config.getResourceMode()){
+ case CLASSPATH:
+ props.setProperty("$loader", "jetbrick.template.loader.ClasspathResourceLoader");
+ props.setProperty("$loader.root", config.getPath());
+ break;
+ case FILE:
+ props.setProperty("$loader", "jetbrick.template.loader.FileSystemResourceLoader");
+ props.setProperty("$loader.root", config.getPath());
+ break;
+ case WEB_ROOT:
+ props.setProperty("$loader", "jetbrick.template.loader.ServletResourceLoader");
+ props.setProperty("$loader.root", config.getPath());
+ break;
+ case STRING:
+ props.setProperty("$loader", "cn.hutool.extra.template.engine.jetbrick.loader.StringResourceLoader");
+ props.setProperty("$loader.charset", config.getCharsetStr());
+ break;
+ default:
+ // 默认
+ return JetEngine.create();
+ }
+
+ return JetEngine.create(props);
+ }
+}
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickTemplate.java
new file mode 100755
index 000000000..78470a41f
--- /dev/null
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickTemplate.java
@@ -0,0 +1,56 @@
+package cn.hutool.extra.template.engine.jetbrick;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.extra.template.AbstractTemplate;
+import jetbrick.template.JetTemplate;
+
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.io.Writer;
+import java.util.Map;
+
+/**
+ * Jetbrick模板实现
+ * 见:https://github.com/subchen/jetbrick-template-2x
+ *
+ * @author looly
+ * @since 5.7.21
+ */
+public class JetbrickTemplate extends AbstractTemplate implements Serializable{
+ private static final long serialVersionUID = 1L;
+
+ private final JetTemplate rawTemplate;
+
+ /**
+ * 包装Jetbrick模板
+ *
+ * @param jetTemplate Jetbrick的模板对象 {@link JetTemplate }
+ * @return JetbrickTemplate
+ */
+ public static JetbrickTemplate wrap(JetTemplate jetTemplate) {
+ return (null == jetTemplate) ? null : new JetbrickTemplate(jetTemplate);
+ }
+
+ /**
+ * 构造
+ *
+ * @param jetTemplate Jetbrick的模板对象 {@link JetTemplate }
+ */
+ public JetbrickTemplate(JetTemplate jetTemplate) {
+ this.rawTemplate = jetTemplate;
+ }
+
+ @Override
+ public void render(Map, ?> bindingMap, Writer writer) {
+ final Map map = Convert.convert(new TypeReference