とある事情があって、JSPのカスタムタグを調べたりしてたのですが、その複雑なことにはあきれました。歴史的経緯がらみの複雑なクラス継承関係から始まって、afterBodyだのBodyContextだのライフサイクルイベントだのエンプティアクションだのさまざまなリターン定数とそれに応じた動作、TLD(タグディスクリプタ)、それをさらにJarで固めて、難しい概念のオンパレード。誰が使うんだこんなの。
Grailsにも含まれるJSPのGroovy版「GSP」は、もうこっちはあほみたいに簡単です。
「HogeTagLib.groovy」のようにクラス名が接尾子「TagLib」で終わるGroovyファイルを指定ディレクトリ(grais-app/tablib配下)に置いておけば、そのプロパティとしてのクロージャがタグ名になります。基本的にそんだけです。
http://grails.org/doc/1.0.x/guide/single.html#6.3%20Tag%20Libraries
にある例を示すと
class SimpleTagLib {
def emoticon = { attrs, body ->
out < < body() << attrs.happy == 'true' ? " :-)" : " :-("
}
}
てな感じ。もちろんコンパイルやサーバ再起動は不要です。
クロージャの引数には属性のマップ(attrs)とタグで囲まれた字の文(body)がわたってきます。上で定義したタグは、GSPのページからg:emoticonで呼び出せます。特にディレクティブの指定も不要です。
gはGSPのデフォルトネームスペースで、別のネームスペース、例えば「my」を指定したければ、そのクラス中に
static namespace = “my”
とか変数宣言するだけです(この場合
NO XML。NO Compile。No Configuration。NO Jar archive。
Javaがいかに簡単なことを複雑にするか、という最悪ケースとしての例でした。ただある意味典型的なケースでもあるかもしれません。agilityが要求されるWebアプリ開発においては、確かにとても受け入れられるものではないな、というのが正直な感想です。