Jellyスクリプトは、スクリプトに置き換えられるXMLドキュメントです。ですから、テキスト・XML・HTMLなどに変換される動的XMLイベントを生成する事が可能です。
Velocity同様、そのXMLドキュメントには動的な出力をする表現を含ませたり、変数を使う事が出来ます。
<document time="${now}">
Welcome ${user.name} to Jelly!
</document>
XMLタグ要素は、ある種の動的処理を実装するJavaコードに結びつける事もできます。これを行うには、JellyのTagインターフェースを実装したJavaBeansであるJelly Tagsを実装するだけです。
Jellyスクリプトを実行する場合、
Jelly BeanのプロパティはXML属性を使って設定できます。
そして、そのTagはdoTag()メソッドを呼び出す事で動きます。
次に、いくつかの処理を行い、本体(XML要素の中身)を何度でもinvokeすることが出来ます。
ですから、Jelly TagsはJSPカスタムタグに非常に良く似ており、
Velocityのディレクティブに類似しています。
AntタスクをJellyスクリプトで使うAntタグライブラリがあります。
また、Jelly Tagsは、Jellyスクリプトの中でdefineタグライブラリを使う事で、動的に実行時に定義する事が出来ます。シンプルながらパワフルなマクロをJellyスクリプトのみを使って容易に作り出す事が出来ます。
タグライブラリを定義する事で、Jelly Beansを作成可能です。Jelly Beanは、Jellyタグと結びついた通常のJava Beanがある場所にあります。BeanがRunnableインターフェースを実装、あるいはinvoke可能なメソッド(run(), invoke(), execute())を持っていれば、Beanは、タグによってもinvokeされます。
例えば、以下のBeanを作成したと仮定しましょう:
public class MyTask {
// 'doIt' method that does some function/task...
public void run() throws SomeException {
// do something...
}
// Properties, can be any type
public void setX(int x) {
this.x = x;
}
public void setY(String y) {
this.y = y;
}
}
新規タグライブラリを定義し、以下のように新規タグを使って、このBeanをスクリプト内で使う事が出来ます:
<j:jelly xmlns:j="jelly:core" xmlns:define="jelly:define" xmlns:my="myTagLib">
<define:taglib uri="myTagLib">
<define:jellybean name="foo" className="MyTask"/>
</define:taglib>
Now lets use the new tag
<my:foo x="2" y="cheese"/>
</j:jelly>
このメカニズムは、Antに措ける<taskdef>の使用とよく似ていますが、ただ、Beanは全ての事が出来、Antタスクから派生させる必要が無く、引数の無い'doIt'形式のメソッド(訳注:run(), invoke(), execute()など)のJavaオブジェクトになり得ます。それどころか、メソッド名は、<define:jellybean method="doIt"/>を通じてセット出来ます。