rhino 调用 java_rhino-java中调用javascript

在有些情况下需要在java里面执行javascript,这时rhino就可以帮忙了。mozilla的一个开源产品。

之前的一篇博客http://my.oschina.net/yybear/blog/101493里面介绍的事件模块处理程序就有利用javascript定义eventHandler,然后解释javascript执行。

先看一个简单的应用:

public class JavaScriptHandle {

private Scriptable global;

private int optimizationLevel = -1; // 介于-1到9之间,负值表示使用解释性执行,不会生成class

private Script script;

void handle() {

Context ctx = Context.enter();

try {

ctx.setOptimizationLevel(optimizationLevel);

if (script == null) {

script = ctx.compileString("var str = 'xx'", "firstRhino", 0, null);

}

Scriptable scope = new NativeObject();

scope.setParentScope(global);

script.exec(ctx, scope);

} finally {

Context.exit();

}

}

public static void main(String[] args) {

JavaScriptHandle jsh = new JavaScriptHandle();

jsh.handle();

}

} 还是很简单的,只有传入一个javascript的字符串就可以了。

但是更多时候我们希望在javascript里面也能调用java。比如我们希望执行这样的javascript

var s ='xx';$console.print(s); $console表示java里面的标准输出。

这时需要先创建一个类

public class ConsoleScriptable extends ScriptableObject {

private static final long serialVersionUID = 1L;

private PrintStream printStream;

public void setPrintStream(PrintStream printStream) {

this.printStream = printStream;

}

public ConsoleScriptable() {

super();

// TODO Auto-generated constructor stub

}

@Override

public String getClassName() {

return ConsoleScriptable.class.getSimpleName();

}

@JSFunction

public static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) {

print0(thisObj, args, false);

}

@JSFunction

public static void println(Context cx, Scriptable thisObj, Object[] args, Function funObj) {

print0(thisObj, args, true);

}

private static void print0(Scriptable thisObj, Object[] args, boolean eol) {

PrintStream printStream = checkInstance(thisObj).printStream;

for (Object arg : args) {

printStream.print(Context.toString(arg));

}

if (eol) {

printStream.println();

}

}

private static ConsoleScriptable checkInstance(Scriptable obj) {

if (obj == null || !(obj instanceof ConsoleScriptable)) {

throw Context.reportRuntimeError("called on incompatible object");

}

return (ConsoleScriptable) obj;

} 这个类就是实现了$console打印字符的功能。使用时先要在rhino里面注册下这个类:

JavaScriptHandle() {

// 初始化

Context ctx = Context.enter();

global = ctx.initStandardObjects();

try {

ScriptableObject.defineClass(global, ConsoleScriptable.class);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} finally {

Context.exit();

}

} 使用代码:

void handle() {

Context ctx = Context.enter();

try {

ctx.setOptimizationLevel(optimizationLevel);

if (script == null) {

script = ctx.compileString("$console.print('xx');", "firstRhino", 0, null);

}

Scriptable scope = new NativeObject();

scope.setParentScope(global);

// 将$console设置标准输出

ConsoleScriptable $console = (ConsoleScriptable) ctx.newObject(scope, ConsoleScriptable.class.getSimpleName());

$console.setPrintStream(System.out);

ScriptableObject.putProperty(scope, "$console", $console); // 设置属性

script.exec(ctx, scope);

} finally {

Context.exit();

}

} 这样javascript里面就可以使用$console了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值