カスタムタグ
初めてカスタムタグを作成して、そのテスト中。奇妙なバグが出て気づいたのだが、Tomcatではタグハンドラーのインスタンスをプーリングしていた。org.apache.jasper.runtime.TagHandlerPoolクラスがプーリング管理を行っている。呼出し毎に新たなインスタンスが生成されているわけではないため、タグハンドラーが、前回呼出時の状態を保持してしまう。状態のリセットを行うにはrelease()メソッドを実装すればよい、と書いてある本もあったが、release()メソッドはタグハンドラーのインスタンスが破棄される際にのみ呼ばれるようなので、プーリングされているTomcatでは呼び出されない。
では、どうすればいいか、ちょっと考えたところ、タグハンドラーでjavax.servlet.jsp.tagext.TryCatchFinallyインターフェースを実装し、doFinally()メソッドでプロパティの初期化を行えば出来そう。これならばほぼ確実に初期化できる。
だが、Ja-jakartaにあったTaglib 開発のガイドラインによれば、
タグハンドラーのコードは setXXX() メソッドがセットしたプロパティを変更してはなりません
こう書いてある。額面どおり受け取ると、プロパティの初期化も行ってはならない、ということになる。一体どうしてなんだろう??プロパティの初期化を出来ないとすると、属性に値がセットされたかどうか判別するためのフラグをプライベート変数で用意しておき、属性のSetterでフラグをオンにしてdoFinally()でフラグを全てオフにする、というような制御をいれなきゃならない。めんどくさ…。