JAVA服务器端来执行javascript脚本
在java下也有不少脚本引擎,像什么什么的——都没记住,不过最后还是选择了执行javascript脚本的引擎rhino,原因很简单,javascript脚本我会用,且据说rhino执行效率还行。不知道是不是不会玩perl或者python此类脚本的就是菜鸟,如果是的话,那我就是菜到不能再菜的鸟了。
言归正传,先给出rhino的下载地址:http://www.mozilla.org/rhino/download.html
下载后,把其中的js.jar加入到你的java工程中,执行以下代码:
import org.mozilla.javascript.*;
public class test
{
/**
* @param args
*/
public static void main( String[] args)
{
// TODO Auto-generated method stub
Context cx = Context.enter();
try
{
String s = "var c = 100 + 200";
Scriptable so = cx.initStandardObjects();
cx.evaluateString( so, s, "ex-1", 1, null);
}
finally
{
cx.exit();
}
}
}
如果没有意外的话,什么错误也不会报,什么输出也不会有。但是语句var c=100+200实实在在的被执行了。
先对执行脚本需要的类对象做一个说明,Context,脚本的运行时环境,Scriptable则是存放变量的地方。这两个类像是计算机的cpu和内存的作用。
在执行脚本前,必须要用Context.enter()进入一个运行时环境,在执行完成后,要用cx.exit()来退出运行环境。可以认为是要使用计算机,必须得先开电源,而用完后得关电源一样。
initStandardObjects()这个方法的作用是创建一个能被当前Context访问的内存Scriptable。
java.lang.Object evaluateString(Scriptable scope, java.lang.String source, java.lang.String sourceName, int lineno, java.lang.Object securityDomain) 这个方法则是在执行一段javascript脚本,scope就是先前创建的Scriptable;source,脚本代码;sourceName,脚本名称,不知道有什么用,可以随便给;lineno,开始执行的行号,一般都是1;securityDomain,和安全有关的东西,可以忽略。
我们把程序的evaluateString语句后增加一条语句System.out.println( so.get( "c", so)),执行后会发现输出的结果正是脚本预期的结果300。
对于像内存一样的Scriptabel来说,我们最常用的两个方法就是get还有put,既然能在脚本执行后从里面取出结果,自然也就能在执行前先用put事先往里面放值。具体俺就不写了。