Mozilla Rhino 简介

於乐
2023-12-01

Rhino 是一个纯 Java 的开源的 JavaScript 实现。他的名字来源于 O'Reilly 关于 JavaScript 的书的封面:

1. 简介

   rhino是使用java代码实现的javascript解释器,它实现了javascript的核心,符合Ecma-262标准,支持javascript标准的所有特性

Rhino 提供了如下功能

ü  JavaScript 1.5 的完全支持

ü  直接在 Java 中使用 JavaScript 的功能

ü  一个 JavaScript shell 用于运行 JavaScript 脚本

ü  一个 JavaScript 的编译器,用于将 JavaScript 编译成 Java 二进制文件

2. 如何运行js脚本

js.jar放入classpath中,在cmd中键入java org.mozilla.javascript.tools.shell.Main后进入运行交互界面(js〉),而后在js〉提示符下输入 load( “文件路径”),注意次数的目录间隔是“/”。而后输入要运行的js的函数名称即可运行js脚本。

例:

js 代码

function isPrime (num)   

{   

    if (num <= 1) {   

        print("Please enter a positive integer >= 2.")   

        return false  

    }   

    var prime = true  

    var sqrRoot = Math.round(Math.sqrt(num))   

    for (var n = 2; prime & n <= sqrRoot; ++n) {   

        prime = (num % n != 0)   

    }   

    return prime   

} 

 

java org.mozilla.javascript.tools.shell.Main

load("D:/isPrime.js");

isPrime(77);

结果=false

3. 脚本调试

在命令行输入java org.mozilla.javascript.tools.debugger.Main可以看到脚本调试页面

4. 如何通过java代码执行javascript

Rhino执行代码的过程

1)   先设置环境,生成各种javascript的本地对象,如:ObjectFunction

2)   使用语法分析对字符串进行分析生成ast

3)   然后再使用IRFactory类将ast转换中间表示形式。

4)   然后再将该中间表示形式转换为二进制代码。

5)   然后执行该代码得出结果。

  public static void main(String[] args) {   

Context ctx = Context.enter();    //获取环境设置

Scriptable scope = ctx.initStandardObjects();    //初始化本地对象

scope.put("x", scope, new Integer(20));    //输入参数设置

scope.put("y", scope, new Integer(30));   

try {   

     ctx.evaluateString(scope, "var result=x+y", "", 1, null);    //执行

    System.out.println(scope.get("result", scope));     //结果输出

} finally {   

     Context.exit();   

}   

5.  Rhino的包结构

org.mozilla.javascript包:该包内的对象是实现javascript的主要对象。

org.mozilla.javascript.ast包:rhino中语法分析器生成的ast表示类都在该包内。

org.mozilla.javascript.debug包:该包实现了javascriptdebug功能。

org.mozilla.javascript.optimizer包:该包实现了javascipt生成代码的代码优化。

org.mozilla.javascript.regexp包:该包实现了javascript正侧表达式的功能。

6JSR233

Jsr233是为java设计的一套脚本语言API,在发行版本中包括了一个基于 Mozilla Rhino JavaScript 脚本引擎。

例:

public class RunJavaScript {
    public static void main(String[] args){
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName ("JavaScript");
        engine.eval("print('Hello World')");
    }
}

如何与java通信

通过put 方法用于将一个 Java 对象映射成一个脚本语言的变量

public class HelloWorld {

    String s = "Hello World";

    public void sayHello(){

        System.out.println(s);

    }

}

 

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class TestPut {
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        HelloWorld hello = new HelloWorld();
        engine.put("script_hello", hello);
        engine.eval("script_hello.sayHello()");
    }
}

 

7. Rhinojava的区别

ü  由于 Rhino 是采用动态类型的语言,因此在函数和变量的声明中看不到类型。您可以使用 function 关键字开始函数的声明,使用 var 关键字来声明局部变量;

ü  Rhino 中语句结束符是可选的;

8. 如何使用java类库

Rhino 中定义了一个全局变量—— Packages,并且它的所有元素也是全局变量,这个全局变量维护了 Java 类的层次结构

var frame = java.io.File("filename");

也可以像 Java 代码中一样把这个对象引用进来

importClass (java.io.File);
var file = File("filename");
importPackage(java.io);

用户自定义的包也可以被引用进来,不过这时候 Packages 引用不能被省略

importPackage(Packages.tony);
var hello = HelloWorld();
hello.sayHello();

 

8.对javabean的支持

Rhino 对于 JavaBean get is 方法将会自动匹配,例如调用 hello.string,如果不存在 string 这个变量,Rhino 将会自动匹配这个实例的 isString 方法然后再去匹配 getString 方法,若这两个方法均不存在才会返回 undefined

 

 官方:

http://www.mozilla.org/rhino/

 

http://www.mozilla.org/rhino/ScriptingJava.html

 

 

 类似资料: