服务端JavaScript之Rhino
最近在看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 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、总结:
这都是很基本的,高级应用还需研究!
服务端JavaScript之Rhino的更多相关文章
- Node.js是一个事件驱动I/O服务端JavaScript环境
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎.目的是为了提供撰写可扩充网络程序,如Web服务.第一个版本由Ryan Dahl于2009年发布,后来,Jo ...
- 学习服务端JavaScript这个有名的Node.js
没接触过,试着简单学一下,从头开始: 参照这个教程:https://github.com/alsotang/node-lessons/tree/master/lesson0 一.搭建环境: 1.搭建N ...
- 使用 PHP 来做 Vue.js 的 SSR 服务端渲染
对于客户端应用来说,服务端渲染是一个热门话题.然而不幸的是,这并不是一件容易的事,尤其是对于不用 Node.js 环境开发的人来说. 我发布了两个库让 PHP 从服务端渲染成为可能.spatie/se ...
- 如何通过JavaScript构建Asp.net服务端控件
摘要 虽然ASP.NET的服务器控件一直被大家所诟病,但是用户控件(ACSX)在某些场景下还是非常有用的. 在一些极特珠的情况下,我们会使用JavaScript动态的构建页面中的控件,但假设遇到了我要 ...
- Asp.Net_ 服务端向客户端写JavaScript脚本
在Asp.net 服务端处理脚本,一般都用 ClientScriptManager ,即web窗体服务端的this.ClientScript.该对象比较常用的方法: 1.RegisterArrayDe ...
- 客户端JavaScript加密数据,服务端Java解密数据
原文:http://blog.csdn.net/peterwanghao/article/details/43303807 在普通的页面提交时,如果没有使用SSL,提交的数据将使用纯文本的方式发送.如 ...
- 服务端渲染 数据驱动 不是渲染后的网页,而是一个由html和Javascript组成的app ssr 隐藏接口服务器
小结: 1. 服务端渲染主要的工作是把组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序. 服务器给到客户端的已经是 ...
- Vue SSR 配合Java的Javascript引擎j2v8实现服务端渲染2创建Vue2+webpack4项目
前提 安装好nodejs并配置好环境变量,最好是 node10,https://nodejs.org/en/download/ 参考我之前的文章 debian安装nodejs Yarn &&a ...
- Vue SSR配合Java的Javascript引擎j2v8实现服务端渲染1概述
原文地址 http://www.terwergreen.com/post/vue-ssr-j2v8-1.html 初步实现方案探索(Node环境) // 第 1 步:创建一个 Vue 实例 const ...
随机推荐
- db2存储过程
一. 使用存储过程的好处 1. 减少客户机与服务器之间的网络使用率,以及数据库锁定保持的时间 应用程序通常在执行每个SQL语句都要跨网络两次,存储过程可以将SQL语句集中在一起, 从而使得对于每一组S ...
- Python时间处理之time模块
1.time模块简介 time模块提供各种操作时间的函数 说明:一般有两种表示时间的方式: 第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一 ...
- Xcode同时兼容Xcode7和Xcode8,两个版本并存,也适用于先升8再安装7
先吐槽一下之前看到的一个教程,如下: 先在应用程序内,拷贝一份之前的xcode,然后再安装新版本,发现这种安装完成就是在之前上面迭代了 有木有?等于没任何作用 我这边就是不小心先升级了8,然后再安装 ...
- tar, rar, unrar, zip, unzip
tar 打包/解包/压缩/解压缩文件,注意打包和压缩不是一回事,打包相当于捆绑,压缩是在捆绑好后再把里面的空隙挤出以生成更小的文件 $tar [-zjxcvf] filename.tar[.gz... ...
- RAID详解[RAID0/RAID1/RAID10/RAID5]
一.RAID定义RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘 ...
- 感觉没睡好就..-shenmedoumeixie....
hi 昨晚没睡好,虽然梦很香,但睡不好没精神做科研啊... 1.jQuery 十二.实现聊天室创建 12.1 基本功能 登陆: 无刷新实时交流: 支持表情. 12.2 大致效果 登陆——>验证, ...
- Caffe 抽取CNN网络特征 Python
Caffe Python特征抽取 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ Caffe大家一般用到的深度学 ...
- windows 10 & Office 2016 安装
Office 2016 VOL版 http://blog.sina.com.cn/s/blog_470614a90102vtmc.html 专业版合集: magnet:?xt=urn:btih: ...
- 能跨域和跨浏览器的flashcookie for jquery插件
对于写网站时需要跨域和跨浏览器的可以看看这个. 引入jquery 和 swfstore.min.js 就可以了,蛮简单好用的,会jquery基础就可以咯. mySwfStore.set('myKey ...
- java 28 - 2 设计模式之 模版设计模式
模版设计模式 模版设计模式概述 模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现 优点 使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求 ...