企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 2.16 直接运行Beetl脚本 Beetl模板本质上会转化为Beetl脚本来执行,这点跟jsp转为servlet来执行类似。BeetlSQL支持3种运行脚本方式 ### 2.16.1 javax.script.ScriptManager 集成 Beetl集成了javax.script.ScriptManager,可以更为方便的使用脚本语言 ```java //初始化部分,beetlEngine应该做为单例使用 ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine beetlEngine = scriptEngineManager.getEngineByName("beetl"); //一个简单例子 SimpleBindings simpleBindings = new SimpleBindings(); simpleBindings.put("arg",arg); Map map = null; try { map = (Map)beetlEngine.eval("return arg.age+(arg.pay+12);",simpleBindings); return map.get("return"); } catch (ScriptException e) { System.out.println(e); } ``` 执行脚本完毕后,返回到Map里的值可能包含如下: - 模板的**顶级**的临时变量,key为临时变量名,value为值 - return 将返回到map里 ,key为"return" 异常e是ScriptException的子类BeetlScriptException,异常信息包含了具体的异常,异常位置。 ### 2.16.2 Scriipt对象 直接调用 在上面的例子,BeetlScriptEngine是ScriptEngine的子类,他实际执行了Beetl的内置的Script功能。,可以掉用getScript方法获取Script对象 ```java StringTemplateResourceLoader loader = new StringTemplateResourceLoader(); GroupTemplate gt = getGroupTemplate(); //假设从某处获GroupTemplate String str = "var a=1+b;return a;" Script script = gt.getScript(str,loader); //必须使用StringTemplateResourceLoader记载字符串脚本 Map map = new HashMap(); map.put("b",2); script.binding(map); script.execute(); if(script.isSuccess()){ return script.getResult(); //返回Map,包含了变量a,以及变量"return" } ErrorInfo error = script.getErrorInfo(); System.out.println(error) //打印出错详情 ``` 注意:这种方式性能比集成ScriptManager稍微好些。 也可以获取Script对象后,调用validate方法验证模板本生是否语法合格 ```java String str = "var a=1+b;return a;" Script script = gt.getScript(str,loader); BeetlExeception ex = script.validate(); if(ex!=null){ ErrorInfo error = new ErrorInfo(ex) //转化成更好处理的ErrorInfo对象 System.out.println(error) //打印出错详情 } ``` 对于集成ScriptEngine的例子,你可以获得Script对象做校验 ```java BeetlScriptEngine beetlEngine = (BeetlScriptEngine)scriptEngineManager.getEngineByName("beetl"); Script script = beetlEngine.getScript(strScript); //其他代码同上 ``` ### 2.16.3 GroupTemplate直接调用 GroupTemplate提供方法可以直接执行Beetl脚本,直接得出结果(不推荐了) - public Map runScript(String key, Map<String, Object> paras) throws ScriptEvalError - public Map runScript(String key, Map<String, Object> paras, Writer w) throws ScriptEvalError - public Map runScript(String key, Map<String, Object> paras, Writer w, ResourceLoader loader) throws ScriptEvalError key为资源名,这里是脚本字符串,paras为脚本的全局变量,w可选参数,如果执行脚本有输出,则输出到w里,loader参数可选,如果指定,则使用此laoder加载脚本 执行脚本完毕后,返回到Map里的值可能包含如下: - 模板的**顶级**的临时变量,key为临时变量名,value为值 - return 值将返回到map里 ,key为return 如下脚本(此时就不需要脚本定界符了) ```javascript var a = 1; var b = date(); var c = '2'; return a+1; ``` 调用runScript后,map里将返回key分别为a,b,c,return。 值分别为1,当前日期,字符串'2,以及3。 groupTemplate.validateScript 可以用于校验模板是否正确,如果不正确,返回BeetlException ~~~java BeetlException ex = groupTemplate.validateScript(script); if(ex!=null){ ErrorInfo info = new ErrorInfo(ex); System.out.println(info.toString()); } ~~~