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的本地对象,如:Object,Function
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包:该包实现了javascript的debug功能。
illa.javascript.optimizer包:该包实现了javascipt生成代码的代码优化。
p包:该包实现了javascript正侧表达式的功能。
6.JSR233
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. Rhino与java的区别
✓ 由于 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小时内删除。
发表评论