采用Rhino在JAVA中运行JavaScript
由于有些网页采用的是swing技术实现(用swing也可以做出好看的界面),在其中使用JavaScript的话可以采用Rhino
对于Rhino的介绍和使用可以参看这篇文章——Rhino 使 JavaScript 应用程序更灵动 ,下面将简单对Rhino介绍一下
1、Rhino介绍
Rhino是开源的JavaScript引擎,可以在引入Rhino的jar包后,在JavaScript中使用Java的类函数,也可在Java中调用JavaScript函数
2、Rhino下载地址
Rhino下载地址:http://www.mozilla.org/rhino/
3、Rhino执行JavaScript编码的小程序
1)程序结构图
2)程序实现
RhinoTest.java类
package com.rhino.test;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextFactory;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;import net.sf.json.JSONObject;public class RhinoTest {public static void main(String args[]) {Context cx = ContextFactory.getGlobal().enterContext();Scriptable scope = cx.initStandardObjects(null);cx.setOptimizationLevel(-1);cx.setLanguageVersion(Context.VERSION_1_8);try {ScriptableObject.defineClass(scope, ExtendUtil.class);} catch (IllegalAccessException e1) {e1.printStackTrace();} catch (InstantiationException e1) {e1.printStackTrace();} catch (InvocationTargetException e1) {e1.printStackTrace();}ExtendUtil util = (ExtendUtil) cx.newObject(scope, "util");scope.put("util", scope, util);String[] file = {"/env.rhino.1.2.js", "/jquery.js" ,"/batchExportWord.js"};for (String f : file) {try {FileReader in = null;in = new FileReader(System.getProperty("user.dir")+"/WebContent/"+f);cx.evaluateReader(scope, in, f, 1, null);if(f.equalsIgnoreCase("/batchExportWord.js")){String jsFunction = "exportWord";Object fObj = scope.get(jsFunction, scope);if (!(fObj instanceof Function)) {System.out.println("找不到方法" +jsFunction);} else {String jsonStr ="{name:'张三',sex:'男',birthday:'1981.10',age:46,faceImg:'./img/face.jpg',education:{academicQualification:'大学本科',degree:'工学学士',university:'清华大学',major:'科学社会主义与国际共产主义运动'}}";JSONObject json = JSONObject.fromObject(jsonStr);Object functionArgs[] = {json};Function fo = (Function)fObj;Object result = fo.call(cx, scope, scope, functionArgs);System.out.println("返回结果:"+Context.toString(result));}}} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}} }
}
ExtendUtil.java类
package com.rhino.test;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;public class ExtendUtil extends ScriptableObject {private static final long serialVersionUID = 1L;@Overridepublic String getClassName() {return "util";}public void jsFunction_log(Scriptable host) {System.out.println(host);}public String jsFunction_getContext(Scriptable host) {return host.toString();}
}
batchExportWord.js,该代码就不粘出了,导出函数同博客JS导出Word——修正jquery.wordexport.js不支持IE8问题 所列代码一致
3)程序介绍
A、运行JavaScript基本环境设置
Context cx = ContextFactory.getGlobal().enterContext();Scriptable scope = cx.initStandardObjects(null);cx.setOptimizationLevel(-1);cx.setLanguageVersion(Context.VERSION_1_8);
B、在JavaScript中设置Java类函数ExendUtil,对应JavaScript对象为 Util
ScriptableObject.defineClass(scope, ExtendUtil.class);ExtendUtil util = (ExtendUtil) cx.newObject(scope, "util");scope.put("util", scope, util);
对于ExtendUtil,JavaScript中调用方式为
util.log('导出word成功');
C、执行JavaScript脚本
cx.evaluateReader(scope, in, f, 1, null);
D、调用JavaScript中的函数,并将函数结果输出
String jsFunction = "exportWord";
Object fObj = scope.get(jsFunction, scope);
String jsonStr ="{.....}";
JSONObject json = JSONObject.fromObject(jsonStr);
Object functionArgs[] = {json};
Function fo = (Function)fObj;
Object result = fo.call(cx, scope, scope, functionArgs);
System.out.println("返回结果:"+Context.toString(result));
E、获取JavaScript输出第二种方式为:即在scope中设置Java的对象在JavaScript中赋值
scope.put("arr", scope, new ArrayList());
在JavaScript中直接使用arr作为数组接收值即可,在Java中调用JavaScript函数的方法后,即可在Java中使用arr中的值了
4)程序输出结果如下图
4、问题
已Java类的形式 运行上述的JavaScript当中的脚步程序成功,但是servlet类,在执行代码cx.evaluateReader(scope, in, f, 1, null) 执行env.rhino.1.2.js脚步时报数组越界错误,如下图,如若有大牛看到这篇文章,请指点,至今未找出解决方法,谢谢。
采用Rhino在JAVA中运行JavaScript相关推荐
- java rhino 运行 js_使用Rhino在Java中调用Javascript脚本
转自:http://www.iteye.com/topic/87423 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式. 结果方案五花八门: 1.jakarta com ...
- java暂停脚本_用Rhino解析Java中的JavaScript:暂停/恢复脚本
我正在使用JDK的javax.script.*包.具体来说,我使用的是JavaScript引擎,据我所读,它似乎是基于Mozilla开发的名为Rhino的JavaScript- in-Java解释器. ...
- 在 .NET Core 中运行 JavaScript
一.前言 在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 . ...
- java 执行js selenium_如何在Selenium WebDriver Java中使用JavaScript
根据您之前的问题,我想您想要从Java的WebDriver运行JavaScript代码段.如果我错了,请纠正我. WebDriverJs实际上是"只是"另一种WebDriver语言 ...
- linux钟java运行命令,在java中运行linux命令
我想在java中运行"ls"命令,我的代码是- 注意: - 我正在使用WINDOWS.在java中运行linux命令 import java.io.IOException; pub ...
- 在 .NET 应用程序中运行 JavaScript
前几天我在做一个副业,意识到我需要使用一些 JavaScript 功能.一想到要再次处理 Node.js 和 npm,我就完全放弃了,所以我决定研究一下在 .NET 应用程序中运行 JavaScrip ...
- php运行js代码,如何在PHP中运行JavaScript代码?(代码示例)
JavaScript是客户端脚本语言,PHP是用于与数据库交互的服务器端脚本语言.那么如何如何在PHP中运行JavaScript?本篇文章就来给大家介绍几种在PHP中运行JavaScript的方法,希 ...
- java 执行javascript_说说如何在 Java 中执行 JavaScript 脚本
Java 是强类型的静态语言,即所有的代码在运行之前都必须先进行严格的类型检查并编译为 JVM 字节码.这样做虽然保证了安全与性能,但却牺牲了灵活性.而那些动态语言(JavaScript .Pytho ...
- java获取vm运行参数_如何获取在Java中运行Java VM的版本?
java获取vm运行参数 To get the version of running VM (Virtual Machine) in Java, we use the getProperties() ...
最新文章
- hashlib模块使用详情
- JS 获取指定时间的时间戳(兼容各个浏览器)
- 自绘列表框控件显示略缩图----再稍微改进点点。。
- 在java中为什么_属性绑定到类型_方法绑定到对象_13. Java基础之类型信息(RTTI和反射)...
- 安装git之后,桌面出现蓝色问号的解决方法
- linux任务计划不执行时间,Linux任务计划、周期性任务执行
- SHOPEX网店系统测试 50万家网站的安全令人担忧
- 微信支付计算机,微信电脑版怎么支付?怎么开通微信支付?
- 菊花是哪个城市的市花1_2.html,菊花的季节作文
- BT-3の蓝牙技术原理のBT协议の蓝牙核心协议の链路管理协议(LMP)
- ClickHouse----单击安装 引擎
- 《地球概论》(第3版)笔记 第三章 地球的运动
- MySQL笔记:第06章_多表查询
- Slider Revolution 轮播滑块Wordpress插件下载
- CVE-2018-0802个人浅析
- 将AAB(Android App Bundle)转换为APK
- filebrowser + frp搭建一个公网+局域网访问的网盘(Windows内网+阿里云服务器)
- Android Bitmap转换
- 基于java的围棋游戏设计
- 串行LCM12864驱动程序