http://gceclub.sun.com.cn/yuanchuang/2004_Q4/judo.html
作者:肖菁
肖菁,软件工程师,IBM developerWorks/Bea dev2dev/sun 技术开发者撰稿人,主要研究J2EE、web services以及他们在websphere、weblogic平台上的实现,拥有IBM的 Developing With Websphere Studio证书。您可以通过guilaida@163.com和作者取得联系,或者查看作者的主页获取更多信息。
JudoScript是一种可以对Java和其他对象进行Scripting的工具; JudoScript通常只需要使用更少的代码来完成任务;你还可以使用BSF在java中执行JudoScript代码段,这样,你可以在整体上不放弃Java体系架构,又充分的利用JudoScript的特性更方便的完成具体的工作。
相信大家都熟悉一些Script,比如JavaScript、VBScript,当然更熟悉的应该是SQL、Unix shell。
很显然,Script就意味着更简单、更快速的达到目标!当然也意味着他们都是面向某一个具体的领域、而不是通用的。比如SQL用于解决数据库的查询问题而Unix shell用于解决服务器的系统管理问题。
JudoScript是一种非常简单易用而又功能强大的Script语言,他基于Java,同时结合多种实现各种功能的开源项目,提供了可针对java对象级、系统级和应用级领域进行Script的能力。
使用java语言的开发人员通常认为java已经足够好,然而面对具体的应用领域,java仍然不能让人足够满意,比如说将一些目录和文件打包成ZIP文件,又比如说我们基于SAX访问XML文档,这些时候需要的代码量通常是比较大的,而且这些问题在java的对象世界中很难再简化(如果要简化,通常不能很好的遵守面向对象的基本原则),这时候JudoScript派上了用场。
JudoScript让我们心动的特性主要体现在以下几点:
1、环境配置
2、代码编写
下面是显示在控制台显示"HelloWorld!"字符串的代码块:
/* * //helloworld.judo * 第一个JudoScript程序,实现在控制台 * 打印Hello World!字符串的功能 */ println "Hello World!"; |
大家可以注意到,这里其实只是使用了一句代码而已,和实现同样功能的java代码比较,JudoScript的代码要少很多。
3、代码运行
要运行JudoScript程序,只要在命令行输入java judo helloworld.judo就可以了,下面是作者运行该命令后的屏幕截图:

下面是一个在JudoScript中使用HashMap对象的例子:
/*
* //java.judo
* 下面的代码显示如何在JudoScript中使用java对象
*/
// 实例化一个HashMap对象
map = new java::java.util.HashMap;
map.put("a","a");
map.put("b","b");
map.put("c","c");
//在控制台打印当前对象的类型
println map.getClass().getName();
//遍历该HashMap对象,将所包含对象的值打印在控制台上
for k in map.keySet() {
println map.get(k);
}
|
[注]需要注意的是在JudoScript中,变量类型是动态的,也就是说变量本身是没有类型的(这是Script语言中的常见处理方式,类似的如JavaScript),变量的值是有类型的。
在java中访问数据库不是一件轻松的事情,以数据库查询为例,从加载数据库驱动到最后的数据输出,需要实例化的对象就有好几个如Conneciotn、Statement、ResultSet等等,而在JudoScript中,你要编写的代码如下:
/*
* //jdbc.judo
* 下面的代码显示如何在JudoScript中查询数据库
*/
// 连接数据库
connect to 'jdbc:oracle:thin:@dbsvr:1521:dbname', 'user', 'pass';
// 执行查询
executeQuery qry:
SELECT user_id, first_name, last_name, birth_date, salary
FROM users
;
// 处理查询结果
println 'user_id First-Name Last-Name Salary Birth-Date', nl
'--- ---------- ----------- -------- ----------';
while qry.next() {
println qry[1].int() :<5,
qry.first_name :<12,
qry.last_name :<12,
qry.salary :*7.1, ' ',
qry.birth_date.fmtDate('yyyy-MM-dd');
}
// 断开数据库连接
disconnect();
|
[注] 请在执行之前将数据库驱动包加入classpath中。
如果大家用过java来实现zip文件的操作,应该会有深刻体会:嵌套的输入输出流、复杂的文件遍历。然而使用JudoScript后,一切就变得非常简单了。
/*
* //zip.judo
* 下面的代码显示如何在JudoScript中创建zip文件
*/
// 下面的代码将c:\tmp目录下的所有文件名以字母"e"开头
// 的文件加入到html.zip文件中的src目录下
// 创建zip文件
zipfile = createZip('html.zip');
// 拷贝文件
copy 'e*' in 'c:\\tmp '
recursive noHidden echo
into zipfile under 'src/';
// 关闭zip文件
// [注] 一定要调用这个方法,否则文件创建不成功
zipfile.close();
|
JudoScript关注的领域远不止这些,在Web应用、EJB调用、XML/WSDL/SGML处理、SOAP调用、io操作、COM组件调用、系统环境变量配置、SCP/SSH/CVS等领域,你都可以通过JudoScript使用很少的代码实现非常强大的功能。
JudoScript是如此的好,然而在java fans的心目中,java仍然是他们的最爱,幸运的是,我们可以将JudoScript代码集成到java中(通过Bean Scripting Framework),这样,我们就可以在java体系架构下面使用强大的JudoScript特性了。你甚至可以在java代码和JudoScript代码之间传递对象实现互操作。
/*
* //java.judo 下面的代码演示如何在java中调用JudoScript代码
* 下面的例子中将实例化一个HashMap对象,然后将他传递给JudoScript代码,
* 在JudoScript代码中给HashMap增加内容,随后遍历该HashMap对象,将他 容纳对象的值打印在控制台上
*/
package org.vivianj;
import java.util.HashMap;
import org.apache.bsf.BSFEngine;
import org.apache.bsf.BSFManager;
public class JavaWithJudoScript {
public void invokeJudoScript() {
try {
//向BSFManager注册JudoScript的解析类
BSFManager.registerScriptingEngine("JudoScript",
"com.JudoScript.BSFJudoEngine", new String[] { "judo", "jud" });
//在java代码中实例化HashMap对象
HashMap map = new HashMap();
//给HashMap增加内容
map.put("a", "a");
//构造JudoScript的BSFManager
BSFManager manager = new BSFManager();
//将HashMap对象传入BSFManager中
manager.declareBean("map", map, HashMap.class);
//创建JudoScript的解析引擎
BSFEngine engine = manager.loadScriptingEngine("JudoScript");
//将可执行的JudoScript代码加入到BSFManager中
String source = "//操作java代码中传入的HashMap对象\r\n"
+ "map.put('b','b'); "
+ "//这个函数遍历HashMap对象,将该对象所包含的内容输出到控制台上\r\n"
+ "function out(){" + "for k in map.keySet() {"
+ "println map.get(k);}" + ";}";
manager.exec("JudoScript", "", 0, 0, source);
engine.call(null, "out", null);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new JavaWithJudoScript().invokeJudoScript();
}
}
|
通过上面的一些简单的例子,相信大家对JudoScript的易用性和适用领域有了很好的认识,你可以不用放弃java体系结构(这是java fans 的骄傲),又可以充分利用JudoScrpt来完成一些使用java比较难完成的任务如操作数据库、xml、zip文件等。
当然你也可以在JudoScript之上进行扩展,比如利用JudoScript建立一个全新的测试框架(作者目前正在进行这方面的研究)。
当然,JudoScript也有缺点,比如他基于文本所以无法通过工具保证代码的正确性,需要编程人员自己保证;又比如他集成了太多的开源项目而且和具体的版本有关系,所以想自己编译JudoScript的源代码不是一件容易的事情,作者花了整整一天的时间去寻找这些需要用到的支持包(其中支持SCP等功能的包的提供者已经不在提供包下载了,作者是在另外一个CVS上下载了源代码编译的,如果大家需要自己编译JudoScript的源代码,可以和作者联系)。
JudoScript文档和FAQ http://www.judoscript.com
文中出现的源代码 judo_examples.zip
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=1788695