`

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程序中的使用,为Java程序引入了脚本化编程的特性,使得Java程序可以更加灵活地处理动态语言的任务,同时也使得那些熟悉JavaScript语法的开发者能够在Java环境中快速上手。Rhino的引入,降低了...

    Java调用javaScript代码

    标题中的“Java调用JavaScript代码”是指在Java程序中执行JavaScript脚本,实现跨语言通信。这主要通过Java的ScriptEngine接口和其相关的API来实现,这些API位于Java的javax.script包中。ScriptEngine接口提供了执行...

    java运行js脚本引擎-----rhino

    4. **API接口丰富**:Rhino提供了丰富的API,允许开发者方便地在Java中嵌入和控制JavaScript执行,如`ScriptEngine`和`ScriptContext`接口。 5. **源码级支持**:Rhino是开源的,源码可读,便于开发者深入理解其工作...

    深入浅出Rhino:Java与JS互操作

    3. **Java API的使用**:书中会详细讲解如何通过Rhino的API在JavaScript中调用Java方法、访问Java变量和类。这包括`org.mozilla.javascript.Context`、`Scriptable`接口和`ScriptableObject`类等核心组件的使用。 4...

    java如何与脚本(javaScript)之间相互调用二

    在Java中调用JavaScript,可以使用ScriptEngineManager来创建一个特定的ScriptEngine实例,例如用于执行JavaScript的Nashorn引擎。以下是一个简单的示例: ```java import javax.script.ScriptEngineManager; ...

    Java直接运行JS代码

    除了执行简单的脚本,我们还可以在Java中调用JavaScript函数。首先,我们需要将函数定义到JavaScript环境中,然后通过`Invocable`接口来调用: ```java engine.eval("function greet(name) { return 'Hello, ' + ...

    加载JavaScript脚本的包

    JWR,全称Java Wrapper for JavaScript,是一个库,它提供了一种更简洁的方式来在Java中调用JavaScript代码。通过JWR,开发者可以将JavaScript对象封装为Java对象,反之亦然,使得两者之间的数据交换更加便捷。 5....

    如何在java中使用javascript,官方指南

    在Java中使用JavaScript,官方指南主要介绍的是在Java平台标准版中嵌入和使用JavaScript脚本语言的官方指导。这通常意味着使用Java代码来调用JavaScript,并且允许JavaScript在Java应用程序内部执行。具体的知识点...

    《kettle中调用java类》示例代码

    在标题《kettle中调用java类》示例代码中,我们关注的是如何在Kettle的转换或作业中嵌入Java代码,以实现更复杂的数据处理逻辑。 首先,Kettle支持两种方式来调用Java类:使用“Java Class”步骤和使用“Execute ...

    Java中使用JavaScript脚本的方法步骤

    在Java中执行JavaScript脚本主要涉及Java Scripting API和一个JavaScript引擎,比如Nashorn。Nashorn是自Java Development Kit 8(JDK 8)起引入的一个JavaScript引擎,它取代了之前的Rhino引擎,并提供了对...

    java执行JavaScript代码

    这篇博客(博文链接已提供)将介绍如何在Java中执行JavaScript代码,这主要得益于Java的脚本引擎API。 Java 6引入了JSR 223(Java Scripting API),使得开发者能够在Java应用程序中嵌入和执行各种脚本语言,包括...

    FF的js引擎rhino源码,java编写

    5. **脚本编写和执行**:Rhino提供了ScriptEngine接口,这是Java Scripting API (JSR 223)的一部分,使得开发者可以方便地在Java程序中执行JavaScript代码,处理脚本编写和执行的各种需求。 6. **Rhino的API**:...

    效率非常快的java读取javascript,附带源码和js.jar

    Java语言在处理JavaScript脚本时,常常会借助于一些库来实现,其中一个著名的库就是Rhino。Rhino是由Mozilla开发的一个开源的JavaScript引擎,它完全用Java编写,能够将JavaScript代码编译为Java字节码,从而使得...

    BSF(java中使用javascript)

    ### BSF(Java中使用JavaScript) #### 一、BSF简介 BSF(Bean Scripting Framework,豆脚本框架)是Apache的一个项目,它提供了一种机制,使得开发者能够在Java应用中集成各种脚本语言,如JavaScript、Python、...

    脚本化Java

    在Java 6版本中,引入了对脚本化语言的支持,特别是通过内置的JavaScript解释器(如Rhino),使得JavaScript可以直接与Java对象交互,执行诸如设置属性、查询状态和调用方法等操作。这一特性极大地扩展了JavaScript...

    java android 执行脚本代码(java代码)

    在Android开发中,Java语言是主要的编程工具,但有时候我们可能需要在应用程序中执行一些脚本代码,比如JavaScript、Python或Shell等。这通常是为了实现一些特定功能,如自动化处理、数据解析或是利用第三方库的脚本...

    Java 8 Nashorn 脚本引擎

    1. **自动化测试**:编写JavaScript脚本以自动化Java应用的测试,比如模拟用户交互或数据验证。 2. **配置管理**:在Java应用的配置文件中使用JavaScript,可以根据运行时环境动态调整配置。 3. **Web API开发**:...

    org.mozilla.javascript-1.7.2.jar

    Rhino以其高效的性能和强大的功能,成为Java开发者在服务器端执行JavaScript脚本的首选工具。 Rhino的核心特性在于其对ECMAScript规范的全面支持,这使得JavaScript代码能够在Java环境中无缝执行。1.7.2版本发布于...

Global site tag (gtag.js) - Google Analytics