Rhino学习笔记
Mozilla Rhino
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中键入ls.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 = und(Math.sqrt(num))   
    for (var n = 2; prime & n <= sqrRoot; ++n) {   
        prime = (num % n != 0)   
    }   
    return prime   
ls.shell.Main
load("D:/isPrime.js");
isPrime(77);
结果=false
3. 脚本调试
在命令行输入ls.debugger.Main可以看到脚本调试页面
4. 如何通过java代码执行javascript
Rhino执行代码的过程
1) 先设置环境,生成各种javascript的本地对象,如:ObjectFunction
2) 使用语法分析对字符串进行分析生成ast
3) 然后再使用IRFactory类将ast转换中间表示形式。
4) 然后再将该中间表示形式转换为二进制代码。
5) 然后执行该代码得出结果。
  public static void main(String[] args) {   
Context ctx = ();    //获取环境设置
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.("result", scope));    //结果输出
} finally {   
    it();   
}   
5. Rhino的包结构
illa.javascript包:该包内的对象是实现javascript的主要对象。
illa.javascript.ast包:rhino中语法分析器生成的ast表示类都在该包内。
illa.javascript.debug包:该包实现了javascriptdebug功能。
illa.javascript.optimizer包:该包实现了javascipt生成代码的代码优化。
p包:该包实现了javascript正侧表达式的功能。
6JSR233
Jsr233是为java设计的一套脚本语言API,在发行版本中包括了一个基于 Mozilla Rhino JavaScript 脚本引擎。
例:
public class RunJavaScript {
    public static void main(String[] args){
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = EngineByName ("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 = EngineByName("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 java笔记总结类的层次结构
var frame = java.io.File("filename");
也可以像 Java 代码中一样把这个对象引用进来
importClass (java.io.File);
var file = File("filename");
importPackage(java.io);
用户自定义的包也可以被引用进来,不过这时候 Packages 引用不能被省略
);
var hello = HelloWorld();
hello.sayHello();
8.对javabean的支持
Rhino 对于 JavaBean get is 方法将会自动匹配,例如调用 hello.string,如果不存在 string 这个变量,Rhino 将会自动匹配这个实例的 isString 方法然后再去匹配 getString 方法,若这两个方法均不存在才会返回 undefined

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。