Hello Taglib
おそらく最も簡単なTaglibの作成を通して,Taglib作成の概要を掴んでみた.
以下のJSPは,本頁で示すサンプルのtaglibを使用して何かを表示するものである.
bodyタグの中に
<sample:hello/>という空タグがあるだけである.このように,taglibを使用すると,それを見ただけでは何が出力されるか想像しがたいJSPを作成することができる...と書いてしまうとマイナスイメージだが,実際には以下のようなtaglibを使用する背景がある.
- オタクの雇用問題
- 「私HTML書けるよ,すごいでしょ?仕事くれよ」っていう牧歌的な時代から,Java ScriptだのCGIだのServletだのっていう流れがある.いろいろ便利に生成できるツールがどんどん出て来たり,多くの人が習得してしまったりするので,それとの戦いなのだそうだ.もっと変態的で複雑なアレがないと,オタクは駆逐されて仕事がなくなるという事情があるらしい...ただあんまり難しすぎるとついていけない人が続出したりするので注意...
- 欺瞞
- 「WEBページデザイナと内部処理のJavaプログラマとの分業ができるよ.だからtaglib作っちゃおうよ.見積もってみました.金くれ」...が,実際には開発部門(あるいはプログラマ)が,ページの見栄えがどうとかいうところまで担当することもあり(というか私はそのパターンしか知らない),だったらスクリプトレットでよいのでは...とかユーザの前ではとても言えない.
- でもやっぱり
- うまくデザインしたtaglibはJSPがすっきりして,しかも共通化,モジュール化ができたりするので,うまくつき合っていきたいような気もする.
<jsp:useBean>といったように,JSPにタグとして記述され,あらかじめ決められ提供されているアクションをしてくれる.標準アクションに対して,独自に定義できる拡張アクションがある.やはり
<custom:myaction>といったようにタグとして記述できる.これをカスタムタグと呼ぶ.で,タグライブラリというのは,これらカスタムタグのライブラリという意味合いで使用され,JSPのディレクティブtaglibにちなんでかどうかわからないが,とにかくtaglibと記述されることもある.
taglibの作成から使用までの概要を以下に示す.
- タグハンドラクラスの作成
- tldファイル(tag library descriptor)の作成
- JSPの記述
- web.xmlの記述
<sample:hello>のタグハンドラを作成して,JSPでそれを呼べるようにしていく.
まずはタグハンドラクラスの作成である.カスタムタグのためのハンドラクラスを作成することで,そのカスタムタグの(拡張)アクションを独自に定義することができる.カスタムタグというのは,タグハンドラに処理を埋め込むことで,呼び出し側のJSPでの処理を簡潔にするものである,とも言えるかもしれない.タグハンドラは以下のいずれかのインタフェースを実装していなければならない.
JSPコンテナからの要件はTagインタフェース,あるいはそのサブインタフェースを実装することなので,基底クラスを必ずしも拡張する必要はないが,Adaptorとして便利なのでしばしば利用されるようだ.以下にTagSupportをサブクラスとして作成したタグハンドラを示す.
タグハンドラは一定のルールで呼ばれるが,ここでは言及しない.とにかくJSPコンテナがカスタムタグの開始タグと終了タグを発見すると,TagインタフェースのdoStartTagとdoEndTagを呼ぶということである.タグハンドラクラスファイルはWEB-INF/classes配下か,jarにしてWEB-INF/libに置く.
- javax.servlet.jsp.tagext.Tag
- javax.servlet.jsp.tagext.BodyTag
- javax.servlet.jsp.tagext.IterationTag
tld(tag library descriptor)は,カスタムタグ,タグハンドラ実装クラス,タグライブラリのマッピング情報をJSPコンテナに提供する.以下に上で作成したサンプルタグハンドラ用tldファイルを示す.
tagの子要素は必須のものだけ記述した.以降,tldファイルはWEB-INF/sample.tldであるとして話を進める.次にもう一度サンプル用JSPを示す.
最後にサンプル用web.xmlファイルを示す.
さて,これらのサンプルを通して,記述ルールを説明してみる.まず,JSPコンテナがカスタムタグを発見する.
と出る.
<sample:hello/>で,:の左(prefix)がsampleとなっている.そしてtaglibディレクティブでprefix="sample"を探す.
<%@ taglib prefix="sample" uri="/sample" %>uriが"/sample"となっている.で,web.xmlで
<taglib>
<taglib-uri>/sample</taglib-uri>
<taglib-location>/WEB-INF/sample.tld</taglib-location>
</taglib>
が見付かる.taglib-uriの内容が一致するので,隣のtaglib-locationを見る.これで/WEB-INF/sample.tldがtldだと分かる(※).さらにWEB-INF/sample.tldで,
<name>hello</name>を探す.見付かったら,同じ
<tag> ... </tag>で囲まれている
<tag-class>sample.HelloTaglib</tag-class>を見付ける.で,sample.HelloTaglibがタグハンドラだと分かる.これでJSPにアクセスすると,
※ taglibディレクティブでいきなりtldファイルを指定してもいけるようだ.

