在javax.script包下提供有关脚本引擎的类和接口,为我们定义了一系列的规范,达到可以在java应用程序中执行脚本语言编写的程序。
javax.script包的主要功能有:
1.脚本执行:执行脚本文件中的程序,使用ScriptEngine的eval方法和Invocable接口的方法。
2.绑定:将java对象作为指定变量公开给脚本程序。相当于为脚本设置全局变量之类的。Bingdings和ScriptContext类用于此目的。
3.编译:将脚本执行一次,生成中间代码,往后只需调用即可,实现高效率。
4.编译功能允许重执行中间代码所表示的整个脚本,而调用功能允许重执行脚本中的个别程序或者方法
接口:
ScriptEngine:
代表一个js引擎,引擎的作用就是动起来,这个引擎可以让javascript脚本跑起来。
Bingings:
其实就是一个Map,为ScriptEngine设置上下文,就是一些全局变量之类的。
Compilable:
将脚本编译成无需重新编译就能够反复执行的某种形式
Invocable:
执行脚本中的程序
ScriptContext:
引擎执行的上下文,类似ServletContext
ScriptEngineFactory:
ScriptEngine的工厂,通过它可以产生ScriptEngine
类:
AbstractScriptEngine:
实现了ScriptEngine接口,为eval方法提供了多种实现
CompiledScript:
编译过的脚本,可以重复执行无需重新解析
ScriptEngineManager:
为ScriptEngine类实现一个发现和实例化机制,还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态
SimpleBingdings:
一个受 HashMap
或其他某些指定 Map
支持的 Bindings 的简单实现
SimpleScriptContext:
ScriptContext 的简单实现
Demo:
js文件:
function show() { return name + " " + age; }
java代码:
@Test public void demo() throws Exception { //通过ScriptEngineManager拿到一个ScriptEngine ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); //创建一个Bindings,设置变量 Bindings bindings = engine.createBindings(); bindings.put("name", "xujianguo"); bindings.put("age", 21); //为engine设置Bindings engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); //执行脚本文件 engine.eval(new FileReader("file/model_two.js")); //判断引擎的可执行性 if(engine instanceof Invocable) { //转换接口类型 Invocable invocable = (Invocable)engine; //执行特定的方法 String result = (String) invocable.invokeFunction("show"); System.out.println(result); } }