服务端JavaScript之Rhino
2024-08-25 23:29:02
最近在看js的书,书上有介绍两个服务端js,以前只听说过node.js,第一次听说Rhino.js,并且已经集成到了jdk1.6;看来还是见的少啊!
Rhino是一种用Java编写的javaScript解释器,能自动完成JavaScript原生类型到Java原生类型之间的相互转换,有了它,可以通过JavaScript脚本设置。查询Java属性,并调用java方法;
先上学习的代码:
package com.my.rhino; import java.io.FileReader;
import java.util.List; import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; public class RhinoDemo { public static void main(String[] args) {
// create ScriptEngineManager
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js");
String script = "print ('hello nm')";
try {
engine.eval(script);
System.out.println();
} catch (ScriptException e) {
e.printStackTrace();
} try {
Double hour = (Double) engine.eval("var date = new Date(); date.getHours();");
String msg;
if (hour < 10) {
msg = "Good morning";
} else if (hour < 16) {
msg = "Good afternoon";
} else if (hour < 20) {
msg = "Good evening";
} else {
msg = "Good night";
}
System.out.println(hour);
System.out.println(msg);
} catch (ScriptException e) {
System.err.println(e);
} try {
FileReader reader = new FileReader("src/com/my/rhino/file.js");
Double num = (Double) engine.eval(reader);
System.out.println(num);
reader.close();
} catch (Exception e) {
e.printStackTrace();
} try {
engine.put("a", 1);
engine.put("b", 5); Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
Object a = bindings.get("a");
Object b = bindings.get("b");
System.out.println("a = " + a);
System.out.println("b = " + b); FileReader reader = new FileReader("src/com/my/rhino/vars.js");
Double num = (Double) engine.eval(reader);
System.out.println(num);
reader.close(); reader = new FileReader("src/com/my/rhino/fun.js");
// engine.eval("function add (a, b) {c = a + b; return c; }");
engine.eval(reader);
Invocable jsInvoke = (Invocable) engine; Object result1 = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
System.out.println(result1); Adder adder = jsInvoke.getInterface(Adder.class);
int result2 = adder.add(10, 5);
System.out.println(result2); Compilable jsCompile = (Compilable) engine;
CompiledScript vscript = jsCompile.compile("function hi () {print ('ddddd !'); }; hi ();"); for (int i = 0; i < 5; i++) {
vscript.eval();
} } catch (Exception e) {
// TODO: handle exception
} try {
FileReader reader = new FileReader("src/com/my/rhino/java.js");
@SuppressWarnings("unchecked")
List<String> num = (List<String>) engine.eval(reader);
System.out.println();
for (String word : num) {
System.out.print(word);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
} List<ScriptEngineFactory> factoryList = manager.getEngineFactories();
for (ScriptEngineFactory factory : factoryList) {
System.out.println("=====");
System.out.println(factory.getEngineName());
System.out.println(factory.getEngineVersion());
System.out.println(factory.getLanguageName());
System.out.println(factory.getLanguageVersion());
System.out.println(factory.getExtensions());
System.out.println(factory.getMimeTypes());
System.out.println(factory.getNames());
}
}
}
Rhino.java
下面解析下:
1、创建一个script 引擎管理器并根据名称获取需要的js引擎;以下所有操作基于这两行代码;
// create ScriptEngineManager
ScriptEngineManager manager = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = manager.getEngineByName("js");
引擎也许不止一个,可以通过以下代码输出查看;
List<ScriptEngineFactory> factoryList = manager.getEngineFactories();
for (ScriptEngineFactory factory : factoryList) {
System.out.println("=====");
System.out.println(factory.getEngineName());
System.out.println(factory.getEngineVersion());
System.out.println(factory.getLanguageName());
System.out.println(factory.getLanguageVersion());
System.out.println(factory.getExtensions());
System.out.println(factory.getMimeTypes());
System.out.println(factory.getNames());
}
获取支持的所有引擎的详细信息;我的机器输出如下:
Mozilla Rhino
1.7 release 3 PRERELEASE
ECMAScript
1.8
[js]
[application/javascript, application/ecmascript, text/javascript, text/ecmascript]
[js, rhino, JavaScript, javascript, ECMAScript, ecmascript]
2、简单输出字符串:
String script = "print ('hello nm')";
try {
engine.eval(script);
System.out.println();
} catch (ScriptException e) {
e.printStackTrace();
} console: hello nm
3、执行简单的js代码获取返回值:
try {
Double hour = (Double) engine.eval("var date = new Date(); date.getHours();");
System.out.println(hour);
} catch (ScriptException e) {
System.err.println(e);
}
console输出当前时间的小时数:
//13.0
4、执行js文件里面的语句,并获取返回值:
//java代码:
try {
FileReader reader = new FileReader("src/com/my/rhino/file.js");
Double num = (Double) engine.eval(reader);
System.out.println(num);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
console ---> 18.0
//file.js
function add(a,b){
return a+b;
} //add(10,8);
result = add(10,8);
//以上两行语句皆可实现
5、传递变量给js文件并执行js文件代码:
//java代码
engine.put("a", 1);
engine.put("b", 5); Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
Object a = bindings.get("a");
Object b = bindings.get("b");
System.out.println("a = " + a);
System.out.println("b = " + b); FileReader reader = new FileReader("src/com/my/rhino/vars.js");
Double num = (Double) engine.eval(reader);
System.out.println(num);
reader.close();
//vars.js
m = a+5;
n = b+6;
d = a+b;
console---> 6.0 //只会返回最后一行的结果值
6、java调用js中的方法:
reader = new FileReader("src/com/my/rhino/file.js");
// engine.eval("function add (a, b) {c = a + b; return c; }");
engine.eval(reader);
Invocable jsInvoke = (Invocable) engine; Object result1 = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
System.out.println(result1);
//动态实现接口,从脚本引擎中得到Java Interface 的实例;也就是说,可以定义个一个Java接口,其实现是由脚本完成,函数名称必须相同;
Adder adder = jsInvoke.getInterface(Adder.class);
int result2 = adder.add(10, 5);
System.out.println(result2);
package com.my.rhino;
interface Adder {
int add(int a, int b);
}
console----->
15.0 15
7、编译执行
脚本引擎默认是解释执行的,如果需要反复执行脚本,可以使用它的可选接口Compilable来编译执行脚本,以获得更好的性能,示例代码如下:
Compilable jsCompile = (Compilable) engine;
CompiledScript vscript = jsCompile.compile("function hi () {print ('ddddd !'); }; hi ();"); for (int i = 0; i < 5; i++) {
vscript.eval();
}
//其中js代码可以从js文件中加载
8、使用java中的对象:
try {
FileReader reader = new FileReader("src/com/my/rhino/java.js");
@SuppressWarnings("unchecked")
List<String> num = (List<String>) engine.eval(reader);
System.out.println();
for (String word : num) {
System.out.print(word);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
//java.js
importPackage(java.util);
//var list = java.util.ArrayList();
var list = ArrayList();
list.add('ni');
list.add(' zai');
list.add(' zuo');
list.add(' sha');
list; //var list = java.util.ArrayList();等价于importPackage(java.util); var list = ArrayList();
9、总结:
这都是很基本的,高级应用还需研究!
最新文章
- tLinux 2.2下安装Mono 4.8
- Java分页需求
- POJ 2406 KMP/后缀数组
- 1-Recyclerview使用系列之Recyclerview的列表数据显示
- [CareerCup] 1.5 Compress String 压缩字符串
- 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005
- web设计经验<;三>;值得你深入了解的交互设计5大支柱
- HDU 2594 扩展kmp模板题
- 如何在Flash中新窗口打开页面而不被拦截
- Windows Phone中使用Native Code
- Android PHP 通过JSON进行数据交互
- QTREE系列题解
- ARM Linux bootloader笔记
- uboot全局变量
- vmlinux,vmlinuz,bzimage,zimage,initrd.img的区别与联系
- 可扩展标记语言XML
- VueJs开发笔记—IDE选择和WebStorm性能优化、框架特性和数据调用、路由选项以及使用
- 端口扫描命令nmap
- c++中使用xercesc对xml进行schema校验
- LESS学习笔记 —— 入门
热门文章
- linux下如何打包压缩?解包解压?.tar文件.gz文件
- Assembly - Registers
- ARM学习篇一 点亮LED
- [PHP]swoole_server几个进程的分工
- UVa10820 Send a Table[欧拉函数]
- Unity(64bit)5.1 打开无故出现框框,纹理不见了
- Flash 二进制传图片到后台Java服务器接收
- [多图]Windows 10 Build 10565今推送:优化界面菜单 Cortana改进
- linux下截取给定路径中的目录部分
- 源码安装mysql