虫虫技术在线--技术决定出路

当前位置: 首页 > 编程 > Java >

JavaScript脚本化Java应用

时间:2010-03-21 14:44来源:未知 作者:admin 点击:
脚本化技术 我喜欢在 vim 或者 emacs 编辑环境中进行文档,代码以及邮件等的编写,她们都提供了良好的命令和快捷键,但是这些都不足以使得她们被誉为 world-class 编辑器,她们的强大

  脚本化技术

  我喜欢在 vim 或者 emacs 编辑环境中进行文档,代码以及邮件等的编写,她们都提供了良好的命令和快捷键,但是这些都不足以使得她们被誉为 world-class 编辑器,她们的强大的真正来源,正是脚本技术。使用脚本,您可以将您的 vim 或者 emacs 配置得无所不能,甚至有人通过脚本来 让 emacs 煮咖啡。

  什么是脚本化

  脚本化可以使 宿主 程序具有 脚本 所描述的能力,比如流行在 DHTML 页面中的 JavaScript 技术,JavaScript 可以让原本是静态的 HTML 代码的页面“活”起来,具有动画,局部刷新等更高级的功能。应用程序一般是以二进制的形式发布的,用户很难根据自己的需求对其进行定制,当然,修改配置文件是一种方式,但是不够灵活。而脚本化则是通过用户自己设计脚本(程序代码 ),然后将其 注入 到应用中,使得应用的行为得到改变。

  如何脚本化您的应用

  通常的做法是,将 宿主 程序的一部分组件暴露给脚本,以方便脚本对其定制,这些组件的作用范围是全局的(可以通过公开接口暴露,也可以将组件实例设置到脚本上下文(context)中),脚本可以在其中添加,修改一些子组件,从而实现定制的目的。本文将通过一个实例来对这个过程以说明,在文章的最后,我们可以得到一个可以运行的小应用出来,如果您对其有不满意之处,可以任意的扩展它。

  JDK 6 中,添加了对脚本的支持,并实现了一些常见的脚本语言与 Java 的交互,比如 Python(Jython)、 JavaScript(rhino)等语言,完整的列表请参考 此处。文中使用的脚本语言为 JavaScript,宿主语言为 Java。(JavaScript 在 DHTML 中应用很广泛,同时,也是我最喜欢的一门编程语言)

  一个小的 todo 管理器

  在文中,我们会先实现一个小型的应用:一个简单的 todo(待办事项)管理器,然后开发一个插件(脚本)框架,最后将使用这个框架对 todo 管理器进行脚本化。

  图 1. sTodo 主界面

  

  这是一个简单的 todo 管理器,可以对待办事项(todo item)进行增删改查等操作,并且可以将这些事项通过邮件发送给指定邮箱等。这个项目目前托管在 Google,项目名为 sTodo。

  图 2. sTodo 右键菜单

  

  设计和实现

  sTodo 是用纯 Java 的 Swing 工具包开发的,其中包含一个嵌入式的数据库 sqlite,整个应用非常简单,我们现在考虑为其增加脚本框架,并为其开发两个脚本,扩展其部分功能。完整的代码可以从 示例代码 中获得。由于 sTodo 为一个开源项目,并且主要由本文开发和维护,所以可以自由的对其进行修改、扩展,使其成为一个真实可用的应用。

  在开始之前,读者可以在 sTodo 的项目主页上下载未经过脚本化的初始版本的源代码,然后根据文中的步骤自己逐步给 sTodo 加入插件机制。

  编写脚本框架

  sTodo 中除了主界面之外,还包含其他一些窗口,如用户配置设置(preference)、新建待办事项窗口、发送邮件窗口等,这些窗口的实现与脚本化无关,我们主要来看看脚本框架的设计与实现。(如果您恰好对 swing 开发感兴趣,可以参考 sTodo 的源码。)

  设计和实现

  JDK 6 之后,对脚本的支持是对脚本引擎(Script Engine)的抽象,JDK 提供的框架设计得非常好,我们在此只是对其进行一个浅包装。具体的功能需要代理到 JDK 的实现上。

  下面是插件框架的类图:

  图 3. 插件框架类图

  图 3. 插件框架类图

  我们现在有了对插件的描述的接口(Plugin),以及对插件管理的接口(PluginManager),并且有了具体的实现类,下面就分别描述一下:

  插件接口:

  定义一个插件所具备的基本功能,包括获取插件名称、获取插件描述、以及将键值对插入到插件的上下文、执行插件公开的功能等方法。

  插件管理器接口:

  定义管理所有插件的管理器,包括安装插件、卸载插件、激活插件、按名称获取插件等方法。

  好了,这个简单的框架基本满足我们的需求。在实现中,我们可以比较简单地将 JDK 6 提供的脚本引擎做一个包装。

  由于插件管理器(PluginManager)的作用范围是全局的,所以我们将其实现为一个单例的对象:(责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容