论坛首页 Java企业应用论坛

Jelly组件的XML脚本处理法(转)

浏览 6043 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-04-25  
http://www.zdnet.com.cn/developer/code/story/0,2000081534,39098508,00.htm

Jelly是一种来自Jakarta的新脚本处理模型,它允许开发人员使用XML来编写脚本。要留心的是,这不仅仅是XML的另一个用途。Jelly功能强大、灵活、好用——更重要的是,它很容易扩展。

现在我们利用Listing A里的简单例子来开始学习使用Jelly。你可以在这里找到本文里所涉及程序的完整代码。
Jelly库

Jelly内置了相当多的库,这列在了表A里。在我们的例子里使用了三个:

    *
      核心(Core)
    *
      日志(Log)
    *
      交互(Interaction)

通过被分派给XML命名空间,库就可以使用了。在XML声明后的第一个标签<j:jelly>里,我们分派三个命名空间:j、l和i。第一个嵌套标签使用了交互标签库。这个库允许你捕捉来自用户的输入。在这里,你请求得到用户名,并提供了一个匿名用户的缺省值。用户输入的结果保存在变量name里。第二个标签使用了日志库。它输出一些文本并在其中用到了name变量。

表A

Jelly库

jelly:core


jelly:xml


jelly:define


jelly:sql


jelly:jsl

jelly:ant


jelly:werkz


jelly:ojb


jelly:jms


jelly:validate

jelly:http


jelly:interaction


jelly:antlr


jelly:util


jelly:html

jelly:junit


jelly:swing


jelly:quartz


jelly:betwixt


jelly:dynabean

jelly:log


jelly:soap


jelly:jetty


jelly:beanshell


jelly:jeez

jelly:email


jelly:bean












全部细节见标签参考。
Jelly的可扩展性

Jelly的一个显著特性是可扩展性。任何常规的JavaBean都能够被绑定到一个XML标签上。JavaBean没有必要扩展任何特别的类或者实现任何特别的接口。如果它支持一个可以调用的方法,例如run()、invoke()或者execute(),在所有适当的设置器被调用以后这个方法才会被调用。如果想要调用一个不同的方法,你可以声明它,就像Listing B所示的这样

Listing B里的类能够通过Listing C里的代码使用Jelly来访问。
Jelly和Ant

Jelly允许对所有已经存在的Ant库进行完全访问。这让使用Ant丰富的工具集来开始编写脚本变得简单起来。例如,使用来自Jelly里的交互和ant库,你能够使用可选的备份功能轻易地编写一个目录复制脚本。(见dircopy.jelly。)

这个Jelly脚本会要你指定一个源目录和目标目录,然后会问你是否想要创建一个备份。如果你回答“是”(这是缺省的选择),它会要你指定一个文件名。脚本会把源目录里的所有的文件都复制到目标目录,如果你回答了“是”,它就创建一个指定目录的tar.gz文件。

Jelly和Maven

尽管作为一个独立的脚本编写语言,Jelly是很有用的,但是它被用得最广泛的地方还是在Maven内,后者是来自Jakarta的项目管理和构建系统。Maven是建立在插件的概念上的。Maven所有的插件都是用Jelly编写的。例如,在Maven里缺省的目标是java:jar,它会为一个项目编译所有的源文件并创建一个可分配的JAR文件。
戴着帽子工作:Jelly标签

我们深入到Jelly的内部来看看它用什么来创建一个自定义的Jelly标签库。我们的例子将是个简单的标签,能够把我们的主体文本变成小写的或者大写的。Jelly标签被集中分组成我们在表A里看到的标签库。标签库在Jelly里被标记为命名空间。

<j:jelly
      xmlns="jelly:core"
      xmlns:case="jelly:com.jelly.examples.CaseTagLibrary">

这个例子让核心标签库缺省的命名空间可用,而让我们自定义的库能够在case命名空间里被使用。CaseTagLibrary必须扩展org.apache.commons.jelly.TagLibrary类,也必须为每个可用的标签调用registerTag方法。

registerTag(“case”, CaseTag.class);

我们现在有一个可用的标签了——case。CaseTag必须扩展org.apache.commons.jelly.TagSupport。TagSupport被声明为抽象的,并需要我们实现doTag(XMLOutput output)。在所有的设置器被调用以后,这个方法会被调用。你要为case标签寻找一个属性类型。而为了我们的标签类,你要像下面这样定义一个设置器方法:

public void setType(String type) {
      this.type = type;
     }

现在让我们来看看CaseTag类的内容——doTag方法。我们要找的第一件事是用户是否提供了所需的属性,就如Listing D里的那样。

如果type被设置成lower或upper,那我们就开始吧。Case标签是设计用来接收标签内容并把文本转换为大写或者小写的。要做到这一点,你要像Listing E里那样访问文本并将其转换过来。

我们的case标签现在已经完成了。完整的源代码请查CaseTag.java(包含在下载的内容里)。你现在就可以像下面这样使用我们的标签了。

<case:case type=”upper”>Hello World!</case:case>

完整的例子见case.jelly(也在下载的内容里)。
Jelly的安装

在下载了Jelly以后,你用Maven来构建和安装它。要把它安装到机器里,就要运行maven dist:install。缺省地,它会被放在/usr/local/jelly下。要使用Jelly,就要确信你把环境变量,$JELLY_HOME,指向了Jelly安装的地方。然后,把$JELLY_HOME/bin添加到你的路径里。Jelly使用forehead来处理类的加载。要让我们的CaseTagLibrary能对jelly使用,把一个包含上述类的JAR文件加到$JELLY_HOME/custom下。
最后几步

现在该是看代码生成的时候了。在含有例子代码的目录里,运行jelly case.jelly。你应该会得到“你好世界(Hello World)”的问候!
结语

Jelly从以前许多脚本编写语言借鉴了所有重要的主旨,并把它们揉合到了一体。它具有高度的可扩展性和易用性,并带有丰富的核心组件集。
   发表时间:2004-04-27  
jelly确实有着很强大的功能,曾经关注过它一段时间。
本质上来说,jelly是为xml增加了脚本解析和运行的功能,这样,让xml真正的“动”了起来。
不过,我个人更倾向于直接使用脚本的方式,现在有很多的脚本语言直接支持java,python(不是很熟悉)、Groovy、BeanShell都非常的棒。
BeanShell的语法和Java最为接近,如果整个开发小组都是java开发人员,BeanShell将是非常好的选择。
0 请登录后投票
论坛首页 Java企业应用版

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