脚本计算与绑定
有了引擎直接调用脚本
eval,英文翻译
评估,计算机领域的功能是
获取返回值。
Object result = engine.eval(scriptString);
脚本存储在文件中,先打开Reader再调用eval
Object result = engine.eval(reader);
同一个引擎调用多个脚本,此脚本定义的变量、函数或类大多数会保留,将来可以使用
engine.eval("n = 1728"); Object.result = engine.eval("n+1"); //返回1729
注释:Object param = factory.getParameter("THREADING"),查看多线程并发执行脚本是否安全。
- null,并发执行不安全。
- "MULTITHREADED",并发执行安全,一个线程执行对其他线程是可视的。
其他的略,自己查。
引擎中添加新的变量绑定,脚本代码从引擎作用域中读取k
engine.put("k",1728); Object result = engine.eval("k+1");
脚本语言可以访问Java对象语法更简单
engine.put("b",new JButton()); engine.eval("b.text = 'Ok'");
获取脚本语句绑定的变量
engine.eval("n = 50"); Object result = engine.get("n");
全局作用域,添加到ScriptEngineManager中绑定对所有引擎都是可视的
可以将绑定收集到一个Bindings对象中,将其传递给eval方法
Bindings scope = engine.createBindings(); scope.put("b",new JButton()); engine.eval(scriptString,scope);
注释:除引擎作用域和全局作用域之外,Web容器可能需要请求作用域或会话作用域。
自己去实现ScriptContext接口,管理一个作用域集合。
整体案例
package 第8章脚本;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JButton;
public class JSEngineTest {
public static void main(String[] args) throws ScriptException, FileNotFoundException {
ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
System.out.println(jse);
jse.eval("n = 50");
Object result = jse.eval("n + 1");
System.out.println(result);
Reader helloJS = new FileReader("D:\\ChromeCoreDownloads\\eclipse-jee-2024-09-R-win32-x86_64\\eclipse\\eclipse-workspace\\spring5-depth-analysis\\src\\main\\resources/hello.js");
jse.eval(helloJS);//var hello = "hello world!!!";
System.out.println(jse.get("hello"));
jse.put("k", 1728);
System.out.println(jse.eval("k+2"));
Bindings scope = jse.createBindings();
scope.put("b", new JButton());
jse.eval("b.text = 'Ok'",scope);
Object b = jse.eval("b.text",scope);
System.out.println(b);
}
}
