Java6.0(JDK1.6)中提供了许多新功能。其中很重要的一项是可以在java中与脚本语言交互,比如,调用js中的函数,或是把java中的对象送到js中去操作。
随着web应用的普及,脚本语言越来越扮演了重要角色。Java恰到好处地提供了对脚本语言的支持,可以说是十分及时、十分必要的。这一特性可以增强Java的动态性能,把许多经常要变动的逻辑放到脚本中去处理。
Java用于支持Script的类都在javax.script包中。下面的例子演示了Java中如何调用js中的函数。
import javax.script.*;
import java.io.*;
public class ScriptTest
{
public static void main(String[] args) throws Exception
{
//生成用于解析的引擎
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
//装入一段js脚本
engine.eval(new FileReader("my.js"));
Invocable in = (Invocable)engine;
//调用脚本中定义函数
Object t = in.invokeFunction("DoIt",15,20);
System.out.println(t);
}
}
所使用的脚本my.js 如下:
function DoIt(x,y)
{
return x*100+y;
}
除了可以调用js外,我们很可能会需要把一个对象,比如list送到js中去处理。下面代码示意了这种情况。
import javax.script.*;
import java.io.*;
import java.util.*;
public class ScriptTest
{
public static void main(String[] args) throws Exception
{
List t = new Vector();
t.add("abcd");
//生成用于解析的引擎
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
//把对象梆定到engine中,以备js中调用
Bindings bd = engine.createBindings();
bd.put("lst", t);
engine.setBindings(bd, ScriptContext.ENGINE_SCOPE);
//装入js脚本
engine.eval(new FileReader("my2.js"));
//调用脚本中定义函数
Invocable in = (Invocable)engine;
in.invokeFunction("AddIt");
for(int i=0; i
System.out.println(t.get(i));
}
}
}
其中使用的my2.js定义如下:
function AddIt()
{
lst.add("xyz");
lst.add("1234");
}
正如您所猜测的,其实不使用Bindings也可把一个对象传入到js中,直接从函数的参数中送过去就可以了。使用Bindings的好处是可以做出类似于“全局变量”的效果,而不用每次都把许多参数传来传去的。
以上只是最基本的例子。更深入的用法参看JDK文档。