高度なカスタマイズ > Info*Engine ユーザーガイド > カスタムタグライブラリ > Java ベースのタグライブラリの実装
  
Java ベースのタグライブラリの実装
Java ベースのタグライブラリを作成したほうが適切な場合があります。たとえば、現在 Info*Engine で利用できないほかの Java ベースの API と統合する必要があるため、スクリプトレットのコードをタスク内 (またはタスクベースのタグ内) に埋め込む必要がある場合などがあります。Java ベースのタグライブラリの実装を作成するとき、一連のインタフェースと補助ベースクラスを実装でき、これらは Info*Engine タスク内でタグとして再利用できます。クラスとインタフェースの詳細については、インストールに付属の Java ドキュメンテーション (/codebase/infoengine/docs/apidocs) 内の com.infoengine.task.tagext パッケージを参照してください。
この場合、タグは単純なイベント駆動型の Java クラスであり、これらのタグはタグライブラリ別にグループ化して分類できます。これを行うには、タグライブラリ記述子 (TLD) と呼ばれる簡単な XML ドキュメントを使用します。これは、ライブラリ、ライブラリで使用できるタグ、各タグで使用できる属性、およびタグとその属性に関する情報を定義します。TLD は、ルート taglib ノード、オプションの description ノード、および任意の数の子 tag ノードで構成されます。tag ノードは、それぞれタグライブラリ内のタグを定義し、そのタグをその実装クラスに関連付けます。tag ノードには、name 子ノード (タグ名を指定) と tagclass 子ノード (タグ実装クラスを指定) が含まれている必要があり、オプションで 1 つの description ノードといくつかの attribute ノードを含めることができます。
attribute ノードはどれも、追加されると、タグで使用できる属性を指定します。その属性が必要であるかどうか、およびその値として定義式を指定できるかどうかは問われません。このため、attribute ノードには、この情報を提供するために namerequired、および rtexprvalue 子ノードが必要です。TLD ファイルの一部分の例を以下に示します。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
<description>My taglibrary.</description>
<tag>
<name>myTag</name>
<description>what this taglibrary does</description>
<tagclass>org.myorg.tags.MyTag</tagclass>
<attribute>
<name>myAttribute<name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
...
</taglib>
この場合、タグライブラリには myTag というタグが含まれており、これは org.myorg.tags.MyTag クラスによって実装されます。このタグには myAttribute という単一の属性が必要であり、これには定義式を指定できます。タグを Info*Engine タスク内に含めるには、タスク内のタグに使用するプリフィックスを定義する @taglib ディレクティブをタスク内で指定し、また、TLD ファイルのロケーション (Info*Engine タスクのルート内にある) も指定する必要があります。たとえば、このタグは、以下のように Info*Engine タスク内で使用できます。
<%@taglib uri=”/org/myorg/myTags.tld” uri=”pfx”%>
...
<pfx:myTag myAttribute=”${@FORM[]myAttributeValue[]}” />
タグの属性は、標準の Java Beans のような set アクセッサメソッドを使用して、タグに提供されます。タグライブラリを読み込むとき、Info*Engine はこれらの実装の詳細をすべて確認します。サポートされている属性に set メソッドがないなど、実装の詳細が原因でタグを適切に読み込むことができない場合には、エラーが発生します。上記の例では、以下のようにタグに set メソッドを使用することもできます。
public void setMyAttribute ( String value )
{
// perhaps set an instance variable or other work
// related to the attribute value specified in the value
// parameter.
}
タグの属性には任意のデータタイプを使用でき、実行時に必要に応じて値が確認されるか強制的に設定されます。サポートされているパラメータ値のデータタイプは以下のとおりです。
String
int
boolean
float
com.infoengine.object.factory.Group
Object
強制設定は、Stringintboolean、および float というプリミティブなタイプに対してのみサポートされています。Object が含まれているため、使用可能なあらゆるタイプの属性を使用できますが、この場合、必要とされるすべてのタイプについて、set メソッドで属性値を検証するか強制的に設定する必要があります。
タグ (com.infoengine.task.tagext.Tag の実装) には、単純なものもあれば、子要素を含むもの (com.infoengine.task.tagext.BodyTag の実装) もあります。BodyTag のインスタンスでは、作業版数もサポートされています。Tag または BodyTag では、例外を処理する方法として TryCatchFinally を実装することもできます。
一般的に、タグが TagSupport または BodyTagSupport ベースクラスを拡張し、必要な do*Tag メソッドで属性の set メソッドと機能を追加して実装を完了します。
さらに、タグは、スクリプトレットコードから、または定義式言語から再利用するために、タスク内で変数を暗黙的に設定するように設計できます。タグでは、com.infoengine.task.tagext.Tag で定義されている以下のメソッドを実装することで、これをサポートできます。
Tag.VariableInfo[] getVariableInfo ( Map<String,String>atts );
このメソッドは、タスクのコンパイル時にのみ呼び出され、暗黙の変数がコンパイルされたタスクのソースで定義される必要があるかどうかを決定します。getVariableInfo メソッドの詳細とこの機能の使用方法については、Java ドキュメンテーションを参照してください。
実行時、タグは大量の短命オブジェクトの作成に関連するパフォーマンス上の問題を回避するためにプーリングされます。これにより、過度のガーベジコレクションが必要とされることあります。したがって、タグがオプションの属性を使用し、属性値をインスタンス変数に保存する点に注意する必要があります。その場合は、finally ブロック内で doEndTag メソッドを実装し、インスタンス変数を再初期化します。これを行わず、タグが前に使用したときのインスタンス変数の値を保持していれば、タグが後で使用するときに予測どおりに機能しない可能性があります。