论坛首页 Java企业应用论坛

java脚本框架介绍与应用(1)

浏览 2513 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-08   最后修改:2009-09-08

    脚本语言因其方便、简洁等特性越来越受到关注,如javascript和groovy。在某些时候,使用脚本语言完成和java一样的功能时会编写得更快更方便,拿java中列表来说,使用java代码和groovy代码的比较如下:

 

 

// 这是java代码
List<String> list = new ArrayList<String>();
list.add("obj1");
list.add("obj2");

// 这是groovy代码
list = ["obj1", "ojb2"];

 

    可以看到,脚本语言更加简洁快速。脚本语言往往是解释性的语言,因此在运行期间动态更改更加利于我们进行测试而无须编译。所以,在需要进行快速编写和频繁修改的前提下,脚本语言的优势得以体现。java从1.6开始就已经将脚本语言的支持加入到标准API中来了,在javax.script包中可以看到该脚本框架的所有功能。如果有用过BSF的话,相信对脚本框架也应该相对比较熟悉了,java脚本语言框架提供的主要功能有:

 

1、使用ScriptEngine标准接口来执行脚本语言(包括代码段、函数、获取返回值等)

 

     该接口是主要的使用接口,可以通过字符串、文件来执行给定的脚本并获取返回值。背后是各个脚本语言引擎的实现

 

2、使用Binds和ScriptContext提供java和脚本语言间的参数传递(支持命名空间)

 

     对每个脚本引擎而言都有独立的命名空间来进行参数传递,同时也提供全局的命名空间和自定义命名空间。java程序和脚本语言可以通过命名空间相互传递参数

 

3、提供对脚本语言的编译/解析缓存(如groovy)以提高执行效率

 

     这是针对实现了Compilable接口的引擎而言的,可以用来缓存编译/解析结果以提供重复执行的效率。比如groovy可以将代码编译为java字节码来执行,效率提高是非常明显的。

 

4、其他功能

 

    其实我们使用前3个主要功能就够了,足可以满足我们在java程序中使用脚本语言的便利。java1.6版的JRE已经自带了javascript脚本语言的实现引擎,采用的是ECMAScript规范的实现Mozilla Rhino。因此,默认我们就可以使用脚本框架在java程序中执行和调用javascript代码了。对于javascript而言,和我们平常在浏览器中使用的基本上都一样,因为都是兼容ECMAScript规范的。有区别的是浏览器中的javascript扩展了可以对DOM对象操作的功能,这是ECMAScript规范中没有的,所以不用指望可以使用类似alert等这样的方言功能了(所有window对象的属性和方法都不可用用的)

 

    使用脚本框架执行javascript是非常简单的,举个简单的例子如下,只需要3个步骤就可以:

 

 

// 脚本引擎管理器,用来动态查找所有的脚本引擎
ScriptEngineManager sem = new ScriptEngineManager();

// 获取js引擎
ScriptEngine jsEngine = sem.getEngineByExtension("js");

// 执行一个js中的打印方法
jsEngine.eval("println('Hello world')");

 

    ScriptEngineManager的动态查找方式是:搜索classpath路径中的所有jar文件,并读取jar文件中

/META-INF/services/javax.script.ScriptEngineFactory文件的内容,该文件就是指定了实现ScriptEngineFactory接口的

实现类。我们可以在jre/lib/resources.jar文件中找到javascript引擎的实现注册。

 

    ScriptEngine负责执行脚本,我们这里使用的是字符串,还可以是Reader对象从流中读取脚本内容。我们写一个js文件存放在类目录下,名称为js-1.js:

 

 

var array = [12,13,15,16,18];
for (var i = 0; i < array.length; i ++) {
	println("index:" + i + ",value:" + array[i]);
}

var obj = {};
obj.a = 'i am a';
obj.b = 'i am b';
for (var p in obj) {
	println("Attribute:" + p + ",value:" + obj[p]);
}
 

    然后写如下java代码保存在ScriptDemo类文件中执行:

 

 

ScriptEngineManager sem = new ScriptEngineManager();

ScriptEngine jsEngine = sem.getEngineByExtension("js");

jsEngine.eval(new InputStreamReader(ScriptDemo.class.getResourceAsStream("js-1.js")));

 

    运行后,我们就可以在控制台打印我们想要的结果了。如果想使用其他脚本语言的支持,直接将其实现了java脚本框架的jar包扔到classpath中即可。比如groovy的发行包已经实现了该规范,只需要将其发行包放入到classpath中然后调用即可。

 

 

    时间原因,暂时就写这么多吧,后面再慢慢补其他特性。。。

   发表时间:2009-09-16  
請問一下JDBC的存取可以寫在腳本裏嗎?
例如:
Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); Connection conn=DriverManager.getConnection("jdbc:derby:数据库名;create=true");
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics