|
|
| Taglib 開発のガイドライン | |
このガイドはタグライブラリの製作者にJSPのカスタムタグを開発する時に 注意すべき点のガイドラインと問題点の要約です。
| タグのライフサイクル管理についてのガイドライン |
-
プロパティは矛盾のないものでなければなりません。これは次に述べることを含みます。
-
ユーザのコードはタグ属性に対するプロパティのタグハンドラのセッターメソッドを呼んではいけません。 もしタグが"value"属性を持っているとしたら、ユーザコードはタグハンドラのsetValue()を呼び出してはいけません。
-
タグハンドラーのコードは setXXX() メソッドがセットしたプロパティを変更してはなりません
-
タグハンドラーはsetXXX() メソッドの中で、呼び出し元に固有なロジックを実行してはなりません。 つまり、プロパティを設定することのほかには副作用があってはならないということです。
-
プライベートな、呼び出し元の状態は、手動で変更してください。 このことは次のことを意味します。
-
release() メソッドは2つのタグの間で必ずしも呼ばれるとは かぎりません。つまりタグのコードは 呼び出しに固有な状態がrelease()メソッドによって必ずリセットされると思ってはいけません。
-
doEndTag()メソッドはすべてのタグの終わりで必ず呼び出されるとは かぎりません。( 異常終了した場合等 ... たとえばタグのボディーの中やタグの メソッドから例外がスローされた場合等です )
-
タグでプライベートに保有される状態は doStartTag() メソッド 中で初期化するのが望ましいです。
-
doFinally() メソッドは TryCatchFinally を実装するタグハンドラによって必ずよばれます。タグ中で取得されたリソースがあるならば、このメソッドの中でリリースすることが必要です。
-
release()メソッドはガーベージコレクションが呼び出される前に少なくとも1回は呼び出されます。長期にわたって保持されるリソースはこのメソッドで 開放するべきです。
-
タグは再利用される可能性が高いためにユーザのコードはそのタグのスコープ の外でタグを参照できてはいけません。つまり
-
タグハンドラは AT_BEGIN や AT_END スコープを持ったスクリプト変数を 外部にさらしてはいけません。 (ただしネストされたスコープは問題になりません)
-
タグハンドラはそれ自体への参照を呼び出されたページの PageContext コンテキストに登録してはなりません。ただしそれがタグハンドラの 呼び出し中にのみ参照される場合は含みません。
|
| 実例 |
-
たとえば解決すべきある種の式を受け付けるタグを持っているとします。
<show value="$my-expression$"/>
"$my-expression$" は doStartTag() の中で評価され、 setValue() によって設定されなければなりません。 通常はこのような動作が望ましいので、setValue() の呼び出し中に式を評価しては いけません。 (文法チェックなどの正当性チェックはセッターメソッド中で行って下さい。)
同様に反復子(Iterators)と列挙型(Enumerations) は setXXX() メソッド から導出されてはいけません。setXXX() メソッドは "idempotent "(訳注:何回呼び出しても状態が変わらないこと。) であることを意味します。 setXXX() メソッドは何回呼ばれても副作用が起こらないように記述しなければ なりません。(逆に何回も呼ぶかわりに1回だけ呼び出しても正常に動作するように することが必要です)
-
通常、タグの呼び出しで保持される状態は release() ではなく doStartTag() で初期化します。
もし反復してループをコントロールするための反復用インデックスがあるとするならば、doStartTag()中で初期化するのがもっとも適切 です。
-
もしそのタグによって呼び出しのたびにデータベースに新規に接続する必要があるならば、(ファイルや その他外部のリソースの場合も同様に)タグハンドラは必ず TryCatchFinally を実装し、データベース接続をdoFinally() メソッドの中でクローズするようにしてください(他のリソースも同様)。 doEndTag() メソッドは呼び出されない可能性があり、release()メソッドは期待しているよりもかなりあとのほうで呼び出される場合があります。
|
|
|