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的本地对象,如:Object,Function
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包:该包实现了javascript的debug功能。
org.mozilla.javascript.optimizer包:该包实现了javascipt生成代码的代码优化。
org.mozilla.javascript.regexp包:该包实现了javascript正侧表达式的功能。
6.JSR233
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. Rhino与java的区别
ü 由于 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/ScriptingJava.html