2019独角兽企业重金招聘Python工程师标准>>>

在有些情况下需要在java里面执行javascript,这时rhino就可以帮忙了。mozilla的一个开源产品。

官网https://developer.mozilla.org/en-US/docs/Rhino

之前的一篇博客http://my.oschina.net/yybear/blog/101493里面介绍的事件模块处理程序就有利用javascript定义eventHandler,然后解释javascript执行。

先看一个简单的应用:

public class JavaScriptHandle {private Scriptable global;private int optimizationLevel = -1; // 介于-1到9之间,负值表示使用解释性执行,不会生成classprivate Script script;void handle() {Context ctx = Context.enter();try {ctx.setOptimizationLevel(optimizationLevel);if (script == null) {script = ctx.compileString("var str = 'xx'", "firstRhino", 0, null);}Scriptable scope = new NativeObject();scope.setParentScope(global);script.exec(ctx, scope);} finally {Context.exit();}}public static void main(String[] args) {JavaScriptHandle jsh = new JavaScriptHandle();jsh.handle();}
}

还是很简单的,只有传入一个javascript的字符串就可以了。

但是更多时候我们希望在javascript里面也能调用java。比如我们希望执行这样的javascript

var s ='xx';$console.print(s);

$console表示java里面的标准输出。

这时需要先创建一个类

public class ConsoleScriptable extends ScriptableObject {private static final long serialVersionUID = 1L;private PrintStream printStream;public void setPrintStream(PrintStream printStream) {this.printStream = printStream;}public ConsoleScriptable() {super();// TODO Auto-generated constructor stub}@Overridepublic String getClassName() {return ConsoleScriptable.class.getSimpleName();}@JSFunctionpublic static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) {print0(thisObj, args, false);}@JSFunctionpublic static void println(Context cx, Scriptable thisObj, Object[] args, Function funObj) {print0(thisObj, args, true);}private static void print0(Scriptable thisObj, Object[] args, boolean eol) {PrintStream printStream = checkInstance(thisObj).printStream;for (Object arg : args) {printStream.print(Context.toString(arg));}if (eol) {printStream.println();}}private static ConsoleScriptable checkInstance(Scriptable obj) {if (obj == null || !(obj instanceof ConsoleScriptable)) {throw Context.reportRuntimeError("called on incompatible object");}return (ConsoleScriptable) obj;}

这个类就是实现了$console打印字符的功能。使用时先要在rhino里面注册下这个类:

JavaScriptHandle() {// 初始化Context ctx = Context.enter();global = ctx.initStandardObjects();try {ScriptableObject.defineClass(global, ConsoleScriptable.class);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} finally {Context.exit();}}

使用代码:

void handle() {Context ctx = Context.enter();try {ctx.setOptimizationLevel(optimizationLevel);if (script == null) {script = ctx.compileString("$console.print('xx');", "firstRhino", 0, null);}Scriptable scope = new NativeObject();scope.setParentScope(global);// 将$console设置标准输出ConsoleScriptable $console = (ConsoleScriptable) ctx.newObject(scope, ConsoleScriptable.class.getSimpleName());$console.setPrintStream(System.out);ScriptableObject.putProperty(scope, "$console", $console); // 设置属性script.exec(ctx, scope);} finally {Context.exit();}}

这样javascript里面就可以使用$console了。

转载于:https://my.oschina.net/yybear/blog/102018

rhino-java中调用javascript相关推荐

  1. java rhino 运行 js_使用Rhino在Java中调用Javascript脚本

    转自:http://www.iteye.com/topic/87423 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式. 结果方案五花八门: 1.jakarta com ...

  2. 采用Rhino在JAVA中运行JavaScript

    由于有些网页采用的是swing技术实现(用swing也可以做出好看的界面),在其中使用JavaScript的话可以采用Rhino 对于Rhino的介绍和使用可以参看这篇文章--Rhino 使 Java ...

  3. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  4. 如何在java中调用js方法

    [java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...

  5. 在Java中调用Python,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 写在 ...

  6. java中调用js_java编程中实现调用js方法分析

    本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEng ...

  7. 在Java中调用Python

    写在前面 参考:https://www.cnblogs.com/nuccch/p/8435693.html 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然 ...

  8. 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  9. java 中调用 Matlab 的函数

    一.matlab版本必须支持java 在command 模式下面运行deploytool,如果支持该命令即可使用 二.matlab中function的书写 %定义一个函数operation(a,b), ...

  10. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

最新文章

  1. ESP32-S模块转接板设计与实现
  2. 【不采用】人工智能如何帮助银行反欺诈
  3. 通过Okta的单点登录保护Spring Boot Web App的安全
  4. 数据库DBA(3年以内需求)
  5. 服务器怎么控制忽略样式_使用JavaScript来编写你的CSS样式代码——JSS
  6. 架构的“一小步”,业务的一大步 1
  7. Linux四剑客详解——awk
  8. 网站可行性报告范文_邢台写可行性报告写立项报告范文-环建
  9. c/c++ hash表 (哈希表、字典表)
  10. XSS跨站脚本攻击详解(包括攻击方式和防御方式)
  11. vm虚拟化服务器杀毒,VMware服务器虚拟化平台应急方案
  12. opencv马赛克python实现
  13. Kafka及控制台【后台管理界面】部署
  14. Quartz_2.2.X学习系列四: Tutorials - Lesson 4: More About Triggers
  15. 云班课作业互评(python3+selenium)
  16. bzoj2298 Problem a
  17. 人工智能轨道交通行业周刊-第25期(2022.11.28-12.4)
  18. 2015年 行人检测总结4
  19. 质子交换膜燃料电池建模与控制研究
  20. 聊聊微服务环境中的可观察性和弹性

热门文章

  1. 吸顶wifi_分享 | 酒店WiFi网络的三种部署模式
  2. Java项目:在线点餐系统(java+Springboot+Maven+mybatis+Vue+mysql+Redis)
  3. Java项目:仿天猫网上商城项目(java+jsp+servlet+mysql+ajax)
  4. oracle 条件反转,Oracle反转倒置函数
  5. linux安装python2和3版本_Windows下安装Python2和Python3双版本
  6. mysql下载解压安装_mysql zip 解压安装
  7. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)
  8. 《虚拟化与云计算》读书感(三)数据中心的概述
  9. 项目管理过程中应注意的问题
  10. 什么是CPI指数和GDP