`

rhino-在JAVA中调用javascript脚本

阅读更多

Rhino可以实现JAVA与javascript的互相调用,有时候我们会希望用javascript解释执行自定义的JAVA语句,如

$console.print("hello world");

这时,可以使用ScriptableObject.defineClass实现注册。具体代码实现可参考如下:

package com.zjyang.scriptable;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.annotations.JSFunction;

import java.io.PrintStream;

public class ConsoleScriptable extends org.mozilla.javascript.ScriptableObject {

    private static final long serialVersionUID = 1L;
    private java.io.PrintStream printStream;

    public void setPrintStream(java.io.PrintStream printStream) {
        this.printStream = printStream;
    }

    public ConsoleScriptable() {}

    @JSFunction
    public static void print(Context cx, Scriptable obj, Object[] args, Function funObj) {
        print0(obj, args, false);
    }

    @JSFunction
    public static void println(Context cx, Scriptable obj, Object[] args, Function funObj) {
        print0(obj, args, true);
    }

    private static void print0(Scriptable obj, Object[] args, boolean eol) {
        PrintStream printStream = checkInstance(obj).printStream;
        for (Object arg : args) {
            printStream.print(Context.toString(arg));
        }
        if (eol) {
            printStream.println();
        }
    }

    private static ConsoleScriptable checkInstance(Scriptable obj) {
        if (null == obj || !(obj instanceof ConsoleScriptable)) {
            throw Context.reportRuntimeError("call ed on incompatible object");
        }
        return (ConsoleScriptable) obj;
    }
    @Override
    public String getClassName() {
        return ConsoleScriptable.class.getSimpleName();
    }
}

 

package com.zjyang.handler;

import com.zjyang.scriptable.ConsoleScriptable;
import org.mozilla.javascript.*;

import java.io.Console;
import java.lang.reflect.InvocationTargetException;

public class JavaScriptHandler {

    private Scriptable global;
    private int optimizationLevel = -1;
    private Script script;

    public JavaScriptHandler() {
        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();
        }
    }

    public void handle() {
        Context ctx = Context.enter();
        try {
            ctx.setOptimizationLevel(optimizationLevel);
            if (script == null) {
                script = ctx.compileString("$console.println('xx');", "firstRhino", 0, null);
            }
            Scriptable scope = new NativeObject();
            scope.setParentScope(global);
            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();
        }
    }

    public static void main(String args[]) {
        new JavaScriptHandler().handle();
        System.out.println("finish");
    }
}

  

个人感觉,在做一些应用时,不用改后台,就可以直接做开发,而且比较容易上手,因为是弱语言类型的了。

 

参考:http://my.oschina.net/yybear/blog/102018

 

分享到:
评论

相关推荐

    Rhino脚本引擎技术介绍

    本文介绍了Rhino脚本引擎,如何在Java中使用脚本引擎调用javascript,以及javascript和java间的交互,并给与示例代码。

    基干Rhino引擎的服务器端JavaScript脚木容器设计与实现 (2012年)

    通过将Rhino引擎置于一个标准的Javaservlet中,便可构造出一个支持JavaScript的服务端脚本容器。借助Rhino引擎,Web开发者不仅能在脚本容器内部访问Java对象,而且还获得了整个Java平台的丰富类库及应用框架的支持。...

    javascript-thesis:论文项目

    为论文收集的统计数据、研究中使用的调用图、调用图的输入程序和用于收集论文数据的插装输入程序dynamic-call-graph:动态调用图 Java 项目,使用编辑过的 Rhino 版本检测 JavaScript 程序。 此外,它有一个后处理器...

    JavaScript权威指南(第6版)

    12.1 用Rhino脚本化Java 12.2 用Node实现异步I/O 第二部分 客户端JavaScript 第13章 Web浏览器中的JavaScript 13.1 客户端JavaScript 13.2 在HTML里嵌入JavaScript 13.3 JavaScript程序的执行 13.4 兼容性和互用性 ...

    JavaScript权威指南(第6版)(附源码)

    12.1 用Rhino脚本化Java 12.2 用Node实现异步I/O 第二部分 客户端JavaScript 第13章 Web浏览器中的JavaScript 13.1 客户端JavaScript 13.2 在HTML里嵌入JavaScript 13.3 JavaScript程序的执行 13.4 兼容性和互用性 ...

    JavaScript权威指南(第6版)中文文字版

    12.1 用rhino脚本化java 291 12.2 用node实现异步i/o 297 第二部分 客户端javascript 第13章 web浏览器中的javascript 309 13.1 客户端javascript 309 13.2 在html里嵌入javascript 313 13.3 javascript程序的执行 ...

    JavaScript 权威指南(第四版).pdf

     12.1 用Rhino脚本化Java291  12.2 用Node实现异步I/O297  第二部分 客户端JavaScript  第13章 Web浏览器中的JavaScript309  13.1 客户端JavaScript309  13.2 在HTML里嵌入JavaScript313  13.3 JavaScript...

    JavaScript权威指南(第6版)中文版pdf+源代码

     12.1 用Rhino脚本化Java291  12.2 用Node实现异步I/O297  第二部分 客户端JavaScript  第13章 Web浏览器中的JavaScript309  13.1 客户端JavaScript309  13.2 在HTML里嵌入JavaScript313  13.3 JavaScript...

    JavaScript权威指南(第6版)(中文版)

    12.1 用Rhino脚本化Java 12.2 用Node实现异步I/O 第二部分 客户端JavaScript 第13章 Web浏览器中的JavaScript 13.1 客户端JavaScript 13.2 在HTML里嵌入JavaScript 13.3 JavaScript程序的执行 13.4 兼容性和互用性 ...

    JavaScript权威指南(第六版) 清晰-完整

    12.1 用Rhino脚本化Java 12.2 用Node实现异步I/O 第二部分 客户端JavaScript 第13章 Web浏览器中的JavaScript 13.1 客户端JavaScript 13.2 在HTML里嵌入JavaScript 13.3 JavaScript程序的执行 13.4 兼容性和互用性 ...

    JavaScript权威指南(第6版)

    12.1 用rhino脚本化java 291 12.2 用node实现异步i/o 297 第二部分 客户端javascript 第13章 web浏览器中的javascript 309 13.1 客户端javascript 309 13.2 在html里嵌入javascript 313 13.3 javascript程序的执行 ...

    JavaScript权威指南(第6版) 中文版

    12.1 用rhino脚本化java 291 12.2 用node实现异步i/o 297 第二部分 客户端javascript 第13章 web浏览器中的javascript 309 13.1 客户端javascript 309 13.2 在html里嵌入javascript 313 13.3 javascript程序的执行 ...

    Transit:连接 JavaScript 和 iOS、OSX、Android 的库

    您可以通过 JS 轻松地将 WebView 或脚本逻辑嵌入到您的应用程序中,并将本机代码作为函数,尤其是事件处理程序传递。 每当您的本机代码被调用时,您都可以使用所有参数以及this参数,即使它们是 JavaScript,再次...

    jquery插件使用方法大全

    延迟对象 延迟对象(Deferred Object,jQuery.Deferred对象)是一个可链接的(chainable)实用工具对象,实现了Promise接口,可以在回调队列中注册多个回调、调用回调队列并转发任何同步/异步函数的成败状态。...

    网管教程 从入门到精通软件篇.txt

    如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart  创建和删除硬盘...

Global site tag (gtag.js) - Google Analytics