最近在看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 ScriptEngineManagerScriptEngineManager 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.jsfunction 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.jsm = 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.jsimportPackage(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、总结:

这都是很基本的,高级应用还需研究!

转载于:https://www.cnblogs.com/liangblog/p/5956256.html

服务端JavaScript之Rhino相关推荐

  1. 服务端渲染与 Universal React App

    随着 Webpack 等前端构建工具的普及,客户端渲染因为其构建方便,部署简单等方面的优势,逐渐成为了现代网站的主流渲染模式.而在刚刚发布的 React v16.0 中,改进后更为优秀的服务端渲染性能 ...

  2. 怎样在javascript函数中将变量传递给服务端脚本程序?

    怎样在javascript函数中将变量传递给服务端脚本程序? (有朋友问上述问题, 愿把结论分享给大家). 摘 要:   服务器端脚本运行时, 它只会解释执行<% %>或<?php ...

  3. 客户端JavaScript加密数据,服务端Java解密数据

    原文:http://blog.csdn.net/peterwanghao/article/details/43303807 在普通的页面提交时,如果没有使用SSL,提交的数据将使用纯文本的方式发送.如 ...

  4. JavaScript社区开发者调查:服务端JS盛行 AngularJS使用者最多

     JavaScript社区开发者调查:服务端JS盛行 AngularJS使用者最多 width="22" height="16" src="htt ...

  5. 【NodeJS】运行在服务端的JavaScript

    [一. 什么是NodeJS]     JS,从最初的理论学习到后来的项目实践,我们都很熟悉了.而本篇博客的主题NodeJS,简单地说,它其实是运行在服务端的JavaScript.下面是具体介绍:    ...

  6. javascript 实现blob加密视频(html video),服务端为php

    现在大部分的网站视频链接都是  blob:http://...... 例如: 出于好奇,研究了一番 其实这种是 视频mp4格式转码m3u8格式  再分为多个小切片(多个小视频)结合 video.js ...

  7. 前端(Javascript) + JAVA 服务端如何处理 HTTP 断点续传

    需求场景 为什么需要断点续传? 假如在生产环境客户或操作上传一个很大的文件(可能有1个G),由于现场网络环境很差,上传到0.5个G的时候突然网络断开了,又要重新上传.客户或操作深吸了一口气,重新上传了 ...

  8. javascript编写奇迹mu原版(含服务端)(1)招人

    有这个想法狠久了.看了抖音里的大量挂羊头,卖狗肉.我受够了. 今天就开始我们自己来打造百分百还原0.97版本的奇迹mu.还原关注本项目. 想法是做网页版的,横屏.分辨率应该是720*自适应高度. 目前 ...

  9. javascript调用服务端验证控件

    //*******************Ajax 调用验证控件(客户端调用服务器验证控件)********************                 Page_ClientValida ...

最新文章

  1. Powerdesigner逆向工程64位Oracle数据库
  2. ibaits与spring整合的心得
  3. mysql using filesort_mysql using filesort Using temporary
  4. VTK:超流线用法实战
  5. pytorch test单张图片_PyTorch版EfficientDet比官方TF实现快25倍?这个GitHub项目数天狂揽千星...
  6. Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨
  7. 略论bs架构设计的几种模式
  8. windowbuilder怎么加图片_一键制作音乐图片,这效果太惊艳了!微信这个功能简直是“宝藏”...
  9. MarkerOpter marker操作类
  10. oracle ns,RAC到单实例SWITCHOVER
  11. C# AE 对图层筛选要素后显示/只显示符合条件的要素
  12. 1060 Are They Equal (25 分)科学计数法,stl中string的各种函数用法
  13. 计算机无法连接到桌面,Win7系统桌面天气小工具提示解决方案无法连接到服务...
  14. Understand(代码分析工具)的安装与使用教程
  15. Python利用wakeonlan库 局域网 网络唤醒电脑
  16. QTableWidget 数据添加与表头设置
  17. c语言计算三棱柱体积,三棱柱的体积
  18. 小米盒子 改装 无线打印服务器,终于找到了“小米盒子增强版”不定期断网的bug了,2.4G模块bug!...
  19. MacBook解决控制台图标问题
  20. Spring MVC过滤器-HttpPutFormContentFilter

热门文章

  1. 2016年第七届蓝桥杯决赛Java本科B组试题解析
  2. BZOJ1503:[NOI2004]郁闷的出纳员——题解
  3. Mac下 Brew 更新缓慢问题解决(配置清华大学开源软件镜像站)
  4. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.11. 外部数据
  5. bzoj 3028 生成函数
  6. Map集合练习之对字符串中字母出现的次数求和
  7. HTML 框架 frameset,frame
  8. [GDUT 决赛]--GCD,LCM——我是好人(数论)
  9. CentOS 6.5+Nagios4.0.2+Msmtp+Mutt邮箱报警
  10. 「APIO2018」选圆圈