From f9f0a5ed1a7ccfcfa861a787ea45be5003b7347b Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 15 Sep 2022 00:34:06 +0800 Subject: [PATCH] =?UTF-8?q?TemplateUtil=E7=9A=84=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=B1=BB=E5=A2=9E=E5=8A=A0getRawEngine=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../template/engine/beetl/BeetlEngine.java | 22 +++-- .../template/engine/enjoy/EnjoyEngine.java | 10 +++ .../engine/freemarker/FreemarkerEngine.java | 12 ++- .../engine/jetbrick/JetbrickEngine.java | 10 +++ .../template/engine/rythm/RythmEngine.java | 24 +++-- .../engine/thymeleaf/ThymeleafEngine.java | 87 +++++++++++-------- .../extra/template/engine/wit/WitEngine.java | 10 +++ .../hutool/extra/template/ThymeleafTest.java | 35 +++++--- 9 files changed, 150 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68cdf872f..ebd9c027a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * 【jwt 】 优化JWT自动识别header中的算法,并可自定义header中key的顺序(issue#I5QRUO@Gitee) * 【core 】 IdcardUtil增加convert18To15方法(issue#I5QYCP@Gitee) * 【core 】 新增AnsiColors(改自Spring Boot)、AnsiColorWrapper,优化QrCodeUtil(pr#778@Gitee) +* 【core 】 TemplateUtil的实现类增加getRawEngine方法(issues#2530@Github) ### 🐞Bug修复 * 【core 】 修复ObjectUtil.defaultIfXXX中NPE问题(pr#2603@Github) diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java index cbb34fed8..d4848f7b8 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java @@ -17,7 +17,7 @@ import java.io.IOException; /** * Beetl模板引擎封装 - * + * * @author looly */ public class BeetlEngine implements TemplateEngine { @@ -32,7 +32,7 @@ public class BeetlEngine implements TemplateEngine { /** * 构造 - * + * * @param config 模板配置 */ public BeetlEngine(TemplateConfig config) { @@ -41,7 +41,7 @@ public class BeetlEngine implements TemplateEngine { /** * 构造 - * + * * @param engine {@link GroupTemplate} */ public BeetlEngine(GroupTemplate engine) { @@ -72,9 +72,19 @@ public class BeetlEngine implements TemplateEngine { return BeetlTemplate.wrap(engine.getTemplate(resource)); } + /** + * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等 + * + * @return {@link GroupTemplate} + * @since 5.8.7 + */ + public GroupTemplate getRawEngine() { + return this.engine; + } + /** * 创建引擎 - * + * * @param config 模板配置 * @return {@link GroupTemplate} */ @@ -103,7 +113,7 @@ public class BeetlEngine implements TemplateEngine { /** * 创建自定义的模板组 {@link GroupTemplate},配置文件使用全局默认
* 此时自定义的配置文件可在ClassPath中放入beetl.properties配置 - * + * * @param loader {@link ResourceLoader},资源加载器 * @return {@link GroupTemplate} * @since 3.2.0 @@ -118,7 +128,7 @@ public class BeetlEngine implements TemplateEngine { /** * 创建自定义的 {@link GroupTemplate} - * + * * @param loader {@link ResourceLoader},资源加载器 * @param conf {@link Configuration} 配置文件 * @return {@link GroupTemplate} diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java index 59c1c815e..1d4164e1f 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java @@ -77,6 +77,16 @@ public class EnjoyEngine implements TemplateEngine { return EnjoyTemplate.wrap(this.engine.getTemplate(resource)); } + /** + * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等 + * + * @return {@link com.jfinal.template.Engine} + * @since 5.8.7 + */ + public com.jfinal.template.Engine getRawEngine() { + return this.engine; + } + /** * 创建引擎 * diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java index 8f207e957..349d31457 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java @@ -15,7 +15,7 @@ import java.io.IOException; /** * FreeMarker模板引擎封装
- * 见:https://freemarker.apache.org/ + * 见:https://freemarker.apache.org/ * * @author looly */ @@ -82,6 +82,16 @@ public class FreemarkerEngine implements TemplateEngine { } } + /** + * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等 + * + * @return {@link Configuration} + * @since 5.8.7 + */ + public Configuration getConfiguration() { + return this.cfg; + } + /** * 创建配置项 * 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 index f6b3f24ed..c347c4107 100755 --- 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 @@ -66,6 +66,16 @@ public class JetbrickEngine implements TemplateEngine { return JetbrickTemplate.wrap(engine.getTemplate(resource)); } + /** + * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等 + * + * @return {@link JetEngine} + * @since 5.8.7 + */ + public JetEngine getRawEngine() { + return this.engine; + } + /** * 创建引擎 * diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java index efd5ed25c..c08cb74ed 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java @@ -1,15 +1,15 @@ package cn.hutool.extra.template.engine.rythm; -import java.util.Properties; - import cn.hutool.extra.template.Template; import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; +import java.util.Properties; + /** * Rythm模板引擎
* 文档:http://rythmengine.org/doc/index - * + * * @author looly * */ @@ -25,7 +25,7 @@ public class RythmEngine implements TemplateEngine { /** * 构造 - * + * * @param config 模板配置 */ public RythmEngine(TemplateConfig config) { @@ -34,7 +34,7 @@ public class RythmEngine implements TemplateEngine { /** * 构造 - * + * * @param engine {@link org.rythmengine.RythmEngine} */ public RythmEngine(org.rythmengine.RythmEngine engine) { @@ -51,6 +51,16 @@ public class RythmEngine implements TemplateEngine { return this; } + /** + * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等 + * + * @return {@link org.rythmengine.RythmEngine} + * @since 5.8.7 + */ + public org.rythmengine.RythmEngine getRawEngine() { + return this.engine; + } + /** * 初始化引擎 * @param engine 引擎 @@ -69,7 +79,7 @@ public class RythmEngine implements TemplateEngine { /** * 创建引擎 - * + * * @param config 模板配置 * @return {@link org.rythmengine.RythmEngine} */ @@ -77,7 +87,7 @@ public class RythmEngine implements TemplateEngine { if (null == config) { config = new TemplateConfig(); } - + final Properties props = new Properties(); final String path = config.getPath(); if (null != path) { diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java index 08c4a4fba..7ebeea2ea 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java @@ -15,7 +15,7 @@ import cn.hutool.extra.template.TemplateEngine; /** * Thymeleaf模板引擎实现 - * + * * @author looly * @since 4.1.11 */ @@ -25,14 +25,16 @@ public class ThymeleafEngine implements TemplateEngine { TemplateConfig config; // --------------------------------------------------------------------------------- Constructor start + /** * 默认构造 */ - public ThymeleafEngine() {} + public ThymeleafEngine() { + } /** * 构造 - * + * * @param config 模板配置 */ public ThymeleafEngine(TemplateConfig config) { @@ -41,7 +43,7 @@ public class ThymeleafEngine implements TemplateEngine { /** * 构造 - * + * * @param engine {@link org.thymeleaf.TemplateEngine} */ public ThymeleafEngine(org.thymeleaf.TemplateEngine engine) { @@ -51,7 +53,7 @@ public class ThymeleafEngine implements TemplateEngine { @Override public TemplateEngine init(TemplateConfig config) { - if(null == config){ + if (null == config) { config = TemplateConfig.DEFAULT; } this.config = config; @@ -61,23 +63,34 @@ public class ThymeleafEngine implements TemplateEngine { /** * 初始化引擎 + * * @param engine 引擎 */ - private void init(org.thymeleaf.TemplateEngine engine){ + private void init(org.thymeleaf.TemplateEngine engine) { this.engine = engine; } @Override public Template getTemplate(String resource) { - if(null == this.engine){ + if (null == this.engine) { init(TemplateConfig.DEFAULT); } return ThymeleafTemplate.wrap(this.engine, resource, (null == this.config) ? null : this.config.getCharset()); } + /** + * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等 + * + * @return {@link org.thymeleaf.TemplateEngine} + * @since 5.8.7 + */ + public org.thymeleaf.TemplateEngine getRawEngine() { + return this.engine; + } + /** * 创建引擎 - * + * * @param config 模板配置 * @return {@link TemplateEngine} */ @@ -85,38 +98,38 @@ public class ThymeleafEngine implements TemplateEngine { if (null == config) { config = new TemplateConfig(); } - + ITemplateResolver resolver; switch (config.getResourceMode()) { - case CLASSPATH: - final ClassLoaderTemplateResolver classLoaderResolver = new ClassLoaderTemplateResolver(); - classLoaderResolver.setCharacterEncoding(config.getCharsetStr()); - classLoaderResolver.setTemplateMode(TemplateMode.HTML); - classLoaderResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/")); - resolver = classLoaderResolver; - break; - case FILE: - final FileTemplateResolver fileResolver = new FileTemplateResolver(); - fileResolver.setCharacterEncoding(config.getCharsetStr()); - fileResolver.setTemplateMode(TemplateMode.HTML); - fileResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/")); - resolver = fileResolver; - break; - case WEB_ROOT: - final FileTemplateResolver webRootResolver = new FileTemplateResolver(); - webRootResolver.setCharacterEncoding(config.getCharsetStr()); - webRootResolver.setTemplateMode(TemplateMode.HTML); - webRootResolver.setPrefix(StrUtil.addSuffixIfNot(FileUtil.getAbsolutePath(FileUtil.file(FileUtil.getWebRoot(), config.getPath())), "/")); - resolver = webRootResolver; - break; - case STRING: - resolver = new StringTemplateResolver(); - break; - default: - resolver = new DefaultTemplateResolver(); - break; + case CLASSPATH: + final ClassLoaderTemplateResolver classLoaderResolver = new ClassLoaderTemplateResolver(); + classLoaderResolver.setCharacterEncoding(config.getCharsetStr()); + classLoaderResolver.setTemplateMode(TemplateMode.HTML); + classLoaderResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/")); + resolver = classLoaderResolver; + break; + case FILE: + final FileTemplateResolver fileResolver = new FileTemplateResolver(); + fileResolver.setCharacterEncoding(config.getCharsetStr()); + fileResolver.setTemplateMode(TemplateMode.HTML); + fileResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/")); + resolver = fileResolver; + break; + case WEB_ROOT: + final FileTemplateResolver webRootResolver = new FileTemplateResolver(); + webRootResolver.setCharacterEncoding(config.getCharsetStr()); + webRootResolver.setTemplateMode(TemplateMode.HTML); + webRootResolver.setPrefix(StrUtil.addSuffixIfNot(FileUtil.getAbsolutePath(FileUtil.file(FileUtil.getWebRoot(), config.getPath())), "/")); + resolver = webRootResolver; + break; + case STRING: + resolver = new StringTemplateResolver(); + break; + default: + resolver = new DefaultTemplateResolver(); + break; } - + final org.thymeleaf.TemplateEngine engine = new org.thymeleaf.TemplateEngine(); engine.setTemplateResolver(resolver); return engine; diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java index 07ebb573b..4463f0f77 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java @@ -73,6 +73,16 @@ public class WitEngine implements TemplateEngine { } } + /** + * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等 + * + * @return {@link Engine} + * @since 5.8.7 + */ + public Engine getRawEngine() { + return this.engine; + } + /** * 创建引擎 * diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java index 6101fa908..e82345ef3 100755 --- a/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java @@ -1,5 +1,15 @@ package cn.hutool.extra.template; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.thymeleaf.context.Context; +import org.thymeleaf.standard.StandardDialect; +import org.thymeleaf.templateresolver.StringTemplateResolver; + import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; @@ -8,23 +18,28 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import org.junit.Assert; -import org.junit.Test; -import org.thymeleaf.context.Context; -import org.thymeleaf.templateresolver.StringTemplateResolver; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.lang.Dict; -import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine; - /** * Thymeleaf单元测试 - * + * * @author looly * */ public class ThymeleafTest { + /** + * ... + * 自定义操作原始引擎 + */ + @Test + @Ignore + public void addDialectTest(){ + final TemplateEngine engine = TemplateUtil.createEngine(); + if(engine instanceof ThymeleafEngine){ + final org.thymeleaf.TemplateEngine rawEngine = ((ThymeleafEngine) engine).getRawEngine(); + rawEngine.addDialect(new StandardDialect()); + } + } + @Test public void thymeleafEngineTest() { Map map1 = new HashMap<>();