From 3041d0b642b519b62f09b5af7b89be16dc0801fe Mon Sep 17 00:00:00 2001 From: juqkai Date: Sat, 8 Aug 2020 17:47:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BFrunScript=E5=8F=AF=E4=BB=A5=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=A8=A1=E6=9D=BF=E3=80=82=E5=90=8C=E6=97=B6=E4=BD=BF?= =?UTF-8?q?template=E5=8F=AF=E4=BB=A5=E6=89=A7=E8=A1=8Cscript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- beetl.md | 20 ++++ .../java/org/beetl/core/GroupTemplate.java | 95 +++++++++---------- 2 files changed, 67 insertions(+), 48 deletions(-) diff --git a/beetl.md b/beetl.md index f4a6638..fde0f86 100644 --- a/beetl.md +++ b/beetl.md @@ -2096,6 +2096,26 @@ return a+1; +如需要执行一般脚本(含脚本定界符),只需要在运行前设置GroupTemplate的scriptType为GroupTemplate.ScriptType.TEMPLATE即可。 +```java +groupTemplate.setScriptType(GroupTemplate.ScriptType.TEMPLATE); +groupTemplate.runScript(...); +``` +```javascript +<%var a = {%> +abc +<%}; +var b = 2; +return a; +%> +``` +输出Map +```javascript +{"return": "abc", "a": "abc", "b":2} +``` + +同样的,在getTemplate方法之前设置scriptType为GroupTemplate.ScriptType.SCRIPT可以使用script做为模板运行。 + ### 4. Web集成 #### 4.1. Web提供的全局变量 diff --git a/src/main/java/org/beetl/core/GroupTemplate.java b/src/main/java/org/beetl/core/GroupTemplate.java index 145f7bf..a3ab93f 100644 --- a/src/main/java/org/beetl/core/GroupTemplate.java +++ b/src/main/java/org/beetl/core/GroupTemplate.java @@ -97,6 +97,12 @@ public class GroupTemplate { // 用于解析html tag得属性,转化为符合js变量名字 AttributeNameConvert htmlTagAttrNameConvert = null; + ScriptType scriptType = null; + + public enum ScriptType{ + SCRIPT,TEMPLATE + } + /** * 使用默认的配置和默认的模板资源加载器{@link ClasspathResourceLoader}, @@ -129,7 +135,7 @@ public class GroupTemplate { /** * 使用loader 和 conf初始化GroupTempalte - * + * * @param loader * 资源加载器 * @param conf @@ -277,10 +283,10 @@ public class GroupTemplate { /** * GroupTempalte 动态加载默写类使用的classloader - * + * * @param classLoader * 资源加载器 - * + * */ public void setClassLoader(ClassLoader classLoader) { @@ -296,8 +302,8 @@ public class GroupTemplate { * @return */ public Script getScript(String key){ - Script t = loadScriptTemplate(key, this.resourceLoader); - return t; + Script t = loadScriptTemplate(key, this.resourceLoader); + return t; } /** @@ -311,9 +317,9 @@ public class GroupTemplate { return t; } - + /**执行某个脚本,参数是paras,返回的是顶级变量 - * + * * @param key * @param paras * @return @@ -400,40 +406,18 @@ public class GroupTemplate { return result; } -// private Script loadScriptTemplate(String key, ResourceLoader loader) { -// -// Program program = (Program) this.programCache.get(key,k->{ -// Resource resource = loader.getResource(key); -// Program loadProgram = this.loadTemplate(resource); -// return loadProgram; -// }); -// if (resourceLoader.isModified(program.res)) { -// Resource resource = loader.getResource(key); -// program = this.loadScript(resource); -// this.programCache.set(key, program); -// } -// return new Script(this, program, this.conf); -// } - private Script loadScriptTemplate(String key, ResourceLoader loader) { - Program program = (Program) this.programCache.get(key,k->{ - Resource resource = loader.getResource(key); - Program prog = this.loadScript(resource); - return prog; - - }); - - if (resourceLoader.isModified(program.res)) { - Resource resource = loader.getResource(key); - program = this.loadScript(resource); - this.programCache.set(key, program); + if (scriptType == null) { + scriptType = ScriptType.SCRIPT; } + Program program = fetchProgram(key, loader); + return new Script(this, program, this.conf); } /**使用额外的资源加载器加载模板 * @param key - * @param loader + * @param loader * @return */ public Template getTemplate(String key, ResourceLoader loader) { @@ -505,18 +489,7 @@ public class GroupTemplate { } private Template getTemplateByLoader(String key, ResourceLoader loader,ContextBuffer buffers) { - Program program = (Program) this.programCache.get(key,k->{ - Resource resource = loader.getResource(key); - Program loadProgram = this.loadTemplate(resource); - return loadProgram; - }); - - if (resourceLoader.isModified(program.res)) { - Resource resource = loader.getResource(key); - program = this.loadTemplate(resource); - this.programCache.set(key, program); - } - + Program program = fetchProgram(key, loader); return buffers==null?new Template(this, program, this.conf):new Template(this, program, this.conf,buffers); } @@ -596,6 +569,24 @@ public class GroupTemplate { } + private Program fetchProgram(String key, ResourceLoader loader){ + Program program = (Program) this.programCache.get(key); + if (program == null || resourceLoader.isModified(program.res)) { + synchronized (key) { + if (program == null || resourceLoader.isModified(program.res)) { + Resource resource = loader.getResource(key); + if(scriptType == ScriptType.SCRIPT){ + program = this.loadScript(resource); + } else { + program = this.loadTemplate(resource); + } + this.programCache.set(key, program); + } + } + } + return program; + } + /** * 关闭GroupTemplate,清理所有的资源 */ @@ -654,7 +645,7 @@ public class GroupTemplate { /** * 注册一个function包,包名由packageName指定,方法名是对象o里的所有方法 * 如果方法定义为void,则方法返回null,如果方法参数最后一个Context,则传入一个Context - * + * * @param packageName * @param o */ @@ -720,7 +711,7 @@ public class GroupTemplate { /** * 注册一个自定义格式化函数 - * + * * @param name * @param format */ @@ -903,4 +894,12 @@ public class GroupTemplate { public AttributeNameConvert getHtmlTagAttrNameConvert() { return htmlTagAttrNameConvert; } + + public ScriptType getScriptType() { + return scriptType; + } + + public void setScriptType(ScriptType scriptType) { + this.scriptType = scriptType; + } } -- Gitee