Rhino使JavaScript应用程序更灵动



导读:脚本语言有良好的快速开发,高效率的执行,解释而非编译执行等优点,并且具有与其他语言编写的组件之间强大的通信功能。JavaScript一直是脚本语言中的领头羊,它是一门具有非常丰富特性的语言。除了浏览器之外,JavaScript也可以应用在其他场合,比如服务器端程序中。Rhino是使用Java语言实现的JavaScript 引擎,本文将介绍如何利用Rhino来使您的应用程序提供JavaScript脚本的支持。

开篇

JavaScript与浏览器完美配合,使得JavaScript成为世界上最流行的语言之一。随着Web应用的发展,AJAX功能实现越来越丰富,JavaScript也越来越受到人们的关注。新一代浏览器正在不断崛起,HTML5逐渐成形和发展壮大,JavaScript也将发挥越来越重要的作用和价值。目前众多的浏览器如IE8、FireFox4.0等做出的调整重点基本是针对于JavaScript引擎的改进和完善,JavaScript的受欢迎程度可见一斑。

以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,使用脚本语言通常比C、C++、Java 之类的语言要简单容易,这也使得脚本语言具有相对于其他程序语言的特性:良好的快速开发,高效率的执行,解释而非编译执行,和其它语言编写的程序组件之间通信功能很强大。

JavaScript一直是脚本语言的领头羊,是一门具有非常丰富特性的语言,使用灵活方便,尤其是内置的轻量级数据类型 JSON 使得 JavaScript更加强大。使得JavaScript除了可以在浏览器中运行,同样可以作为应用程序的一部分使用在其他领域。在应用程序中使用JavaScript脚本可以为用户提供自定义公式、自定义单据转换规则、自定义工作流等功能,同时具有以下优势:

  • 使用灵活方便,有利于快速开发
  • 不需要编译,更新后马上可以看到运行效果
  • 代码轻量,同样的程序只需要五分之一至十分之一的代码量

Rhino是开源的JavaScript 引擎,是完全基于Java实现,几乎可以使用JavaScript完成Java所有的工作。它可以提供强大的计算能力,没有I/O的限制,可以将JavaScript编译成 Java 字节码,具有良好的速度和性能。在Rhino环境中既可以使用JavaScript脚本语言,同时也可以非常简单的使用Java语言的某些工具。Rhino为我们提供了如下功能:

  • 对JavaScript 1.5 的完全支持
  • 直接在 Java 中使用JavaScript的功能
  • 一个JavaScript shell 用于运行JavaScript脚本
  • 一个JavaScript 的编译器,用于将JavaScript编译成Java二进制文件

本文将向您介绍如何使用Rhino JavaScript引擎,以及如何在您的项目中嵌入Rhino JavaScript引擎。阅读本文需要对Java 和JavaScript有一定的理解和体会。本文中简单介绍了如何使用交互模式调用JS解释器,如果您感觉本部分理解有困难,很有可能是您对于控制台的使用不是特别熟悉,建议您了解一下控制台的使用方式。希望本文可以给您的学习和工作提供一定的帮助。

Rhino使用

Rhino环境准备

从Mazilla网站上下载Rhino引擎(本文撰写基于最新的版本 Rhino-1.7R3),下载地址为 http://www.mozilla.org/rhino/。将软件包解压,可以得到Rhino源代码、文档、测试代码、样例以及一些小工具,利用这些我们便可以通过多种方式执行JavaScript脚本。

使用交互模式调用JS解释器

1.进入交互模式

进入交互模式有两种方式:使用 js.jar文件实现和使用org.mozilla.javascript.tools.shell实现。

打开控制台,并切换ja.jar文件所在的目录,输入java -jar js.jar命令,便会出现解释器的版本信息,并进入带提示符 js>的命令模式。

或切换到tools编译后目录,输入java org.mozilla.javascript.tools.shell.Main,同样可以进入带提示符js>的命令模式。

2.加载JavaScript文件

创建简单的 JavaScript 文件 tools.js,其代码如下:

在命令行中输入 load("C:/tools.js"),完成tools.js文件的加载。注意在此处"/"和"\"是有区别的,不能换用。

3.测试JavaScript代码运行

在命令行中输入tools.testPlus(1,2),显示执行结果为3,证明JavaScript代码运行成功。

4.退出交互模式

退出交互模式可以按Ctrl+Z(Windows 系统)或Ctrl+D(Linux 或 Unix 系统的方式退出,也可以调用quit()方法退出。

Java嵌入开发

本部分将向您介绍如何将Rhino JavaScript引擎嵌入到您的项目中,从而使您的应用程序增加脚本的支持,提高灵活度。简单而言,Rhino的作用在于构造一个 JavaScript 运行所需要的运行环境,亦即下面所用的关键词上下文Context,下面一步步向您介绍具体使用方式。

1.引入Rhino JavaScript工具包

在您的 Java 项目中使用 Rhino JavaScript 引擎,首先要做的工作是要将其引入到您的项目中,所需要类都在 org.mozilla.javascript命名空间下,示例如下:

 import org.mozilla.javascript.Context;

 import org.mozilla.javascript.Scriptable;

2.进入上下文

在导入Rhino JavaScript的Java包之后,需要创建并进入Context。本步骤的作用在于构造JavaScript的运行环境,Context 中储存了脚本执行的全局环境信息,示例代码如下:

 Context cx = Context.enter();

构造 JavaScript 的运行环境非常的简单,只需要调用Java 类 Context的静态方法 enter 即可,而无需对Context类进行实例化,该方法将会返回Context的一个实例。

3.初始化标准对象

在使用Rhino执行脚本之前,必须初始化标准对象(Object,Function 等),示例代码如下:

 Scriptable scope = cx.initStandardObjects();

作用域是JavaScript中一个相当重要的概念,在本步骤初始化的scope变量类似于构造了一个全局对象,而在整个运行过程中 JavaScript的变量都会作为该对象的一部分,在下文中介绍的在Java中调用JavaScript变量就是通过该对象实现。初始化标准化对象,需要调用上下文实例的initStandardObjects方法,执行结果将会返回一个Scriptable实例化对象。

4.执行 JavaScript 脚本

当以上准备工作结束后,便可以正常的执行 JavaScript 脚本,示例代码如下:

 Object result = cx.evaluateString(scope, string, error, num, null);

JavaScript 脚本的执行是使用上下文示例中的 evaluateString 方法,执行脚本字符串 string,当脚本中需要使用其它变量时,会在作用域 scope 中寻找所需要的变量,如果发生异常的话则会报告 error 错误信息和所在的行号 num,正确执行结束后会返回一个 Object 对象的运行结果。

5.输出运行的结果

JavaScript 没有独立的输入输出方法,必须借助于宿主环境的输入输出方法,这里使用 Java 的输出机制 System.out.println 方法,示例代码如下:

 System.out.println(cx.toString(result));

6.结束上下文

结束上下文是每次使用 Rhino 结束后必须要做的工作,它将移除上下文和当前的线程并做垃圾回收。示例代码如下:

 Context.exit();

在每次进入上下文后您都应该调用它退出方法,因为在使用过程中可能会产生异常,所以通常在调用 Context.enter() 进入上下文之后,将退出操作放入对应的 finally 块中。

7.在运行环境中导入 JavaScript 工具包

在系统开发过程中,我们经常会使用一些 JavaScript 工具包,如加密工具包等。而使用 Rhino 导入工具包也是非常的简单方便,只需要将工具包文件中的内容以字符的形式在上下文中运行,以后便可以使用对应的作用域中直接使用。示例代码如下:

Java和JavaScript 对象相互调用

从根本上讲在Java项目中嵌入JavaScript脚本引擎,最重要的一点是实现Java和JavaScript之间的数据共享,而使用Rhino JavaScript引擎我们不需要添加任何的代码和实现,便可以使用Java和JavaScript对象之间相互调用,例如在JavaScript 脚本中可以十分方便的去调用Java的工具包,而在Java中又可以十分方便的去调用JavaScript脚本中的变量,从而实现二者之间的无缝结合,提高项目的灵活度,下面将从这两个方面去详细介绍实现方式。

1.在JavaScript脚本中使用Java对象

将Java部分代码或者功能实现作为JavaScript一部分,以脚本的方式执行,这种方式在极大程度上可以减少用户为解决个别问题而费尽脑筋。在JavaScript中可以直接使用Java对象,示例代码如下:

在上述实例代码中实现了在JavaScript代码中直接调用Java的输出方法,这种方式可能从感觉上不是很舒服,因为需要明确定义Java的命名空间等信息。另外,也可以将Java对象转换为JavaScript对象,并添加到运行环境中,需要添加额外的代码去实现,这种方式有点像Java工具包的导入,示例代码如下:

2.在Java中调用JavaScript脚本中的变量

在Java中若要取得JavaScript脚本的运行结果非常的简单,在前面的文字中我们已经探讨过,使用运行返回的结果即可。然而在项目开发中我们或许常常会希望获得一些额外的信息,比如运行过程中的一些临时信息,无法作为最终结果返回时,本部分将是您特别希望得到的,而本部分的实现十分简单,简单的几行代码便可以实现。示例代码如下:

在上述的示例代码中,我们同样用到了scope变量,这个是JavaScript运行时的全局变量,您可以将它理解成为一个容器,里面包含了JavaScript运行过程中的所有信息,所以在您希望取得 JavaScript 过程中的某些信息时,请首先考虑该对象。

3.在Java中调用JavaScript脚本中的函数

在前文中我们已经向您展示了如何将Java代码以JavaScript脚本的方式运行,同样我们也可以将JavaScript脚本作为Java代码进行实现,这样可以使您的项目复用度极大提高,也将会使您在项目开发过程中更加得心应手,示例代码如下:

结束语

正如导言中所说,JavaScript脚本可以为我们的应用程序注入新鲜活力,在用户自定义方法和流程中将会发挥巨大的灵活性和价值。Rhino是轻量级而又功能强大的JavaScript引擎,而且完全基于Java实现,与Java应用程序完美结合,将会成为 Java应用程序开发首选工具。

你可能感兴趣的:(Rhino使JavaScript应用程序更灵动)