タグ・ライブラリを使用すると、開発者は関連する機能を持つタグを1つにまとめることができます。タグ・ライブラリには、タグ拡張を記述し、それらをJavaクラスに関連付けるタグ・ライブラリ記述子(TLD)ファイルが必要となります。TLDは、WebLogic Serverとオーサリング・ツールが拡張機能に関する情報を取得するために使用されます。TLDファイルのファイル拡張子は.tldで、このファイルはXML表記法で記述されます。
タグ・ライブラリ記述子ファイル内の要素は、XSDに定義されている順序で並べます。この順序付けは、以下に示す手順で使用されます。TLD要素がこの順序どおりに並べられていない場合、XMLパーサーは例外を送出します。
TLDの本体は、<taglib> ... </taglib>
要素の中にネストされた要素を含んでいます。これらのネストされた要素についても次の手順で説明します。このドキュメントでは、見やすくするためにネストされた要素はその親要素からインデントされていますが、TLDではインデント処理は必要ありません。
「タグ・ライブラリ記述子のサンプル」の例では、codeという新しいタグを宣言します。このタグの機能は、Javaクラスのweblogic.taglib.quote.CodeTag
によって実装されます。
タグ・ライブラリ記述子を作成するには、次のようにします。
次にタグ・ライブラリ記述子の一覧を表す例を示します。
<taglib version="2.0" xmlns="http://java.sun.com/xml/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <taglib> <tlib-version>2.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>quote</short-name> <uri>tag lib version id</uri> <description> This tag library contains several tag extensions useful for formatting content for HTML. </description> <tag> <name>code</name> <tag-class>weblogic.taglib.quote.CodeTag</tag-class> <body-content>tagdependent</body-content> <attribute> <name>fontAttributes</name> </attribute> <attribute> <name>commentColor</name> </attribute> <attribute> <name>quoteColor</name> </attribute> </tag> </taglib>
JSP 2.0コンテナでサポートされるDynamicAttributes
インタフェースを、開発の時点で名前が既知でなくても値が一貫性のある方法で処理されるタグとして使用できます。
たとえば、<table>
HTMLタグのwidth
部分を、実行時に値を決定してカスタマイズする場合は、DynamicAttributes
インタフェースを利用して、<table>
タグの他の部分(border
、cellspacing
など)に指定を行うことなく、タグの変更する部分のみをカスタマイズできます。DynamicAttributes
インタフェースを使用せずにwidth
の値を実行時に動的に決定するには、タグ・ハンドラなどの複雑なコードを記述する必要があります。
タグ・ハンドラで動的な属性を受け付けるかどうかを最終的に決定するのはTLDです。タグ・ハンドラで、TLDにおいて動的な属性をサポートすると宣言しているにも関わらず、DynamicAttributes
インタフェースがサポートされていない場合、タグ・ハンドラはコンテナによって無効と見なされます。
呼び出されるタグのdynamic-attributes
要素(作成されているタグ・ライブラリのtag
要素の子要素)に、値trueが含まれている場合、以下の要件が適用されます。
TLD内に対応する属性要素のないタグ呼出しで指定された各属性について、属性のネームスペース(または、属性にネームスペースも接頭辞もない場合はnull)、ネームスペース接頭辞なしの属性名、および属性の最終的な値を渡すsetDynamicAttribute()
を呼び出す必要があります。
動的な属性は、要求時の式の値を受け付けるものと見なされる必要があります。
動的な属性は、java.lang.Object
型として扱われる必要があります。
JSPコンテナは、<jsp:attribute>標準アクションを使用してタグ・ハンドラに渡される動的な属性を認識する必要があります。
setDynamicAttribute()
メソッドがJspException
を送出する場合、doStartTag()
またはdoTag()
メソッドはこのタグに対しては呼び出されず、例外は通常の属性セッター・メソッドから送出された場合と同様に扱われる必要があります。
標準構文またはXML構文のどちらのJSPドキュメントでも、動的な属性がネームスペースにマップされない接頭辞を持つ場合は、変換エラーが発生します。標準の構文では、taglibディレクティブで定義されたネームスペースだけが認識されます。
以下の例では、属性a
およびb
が、TLDの属性要素で宣言されており、属性d1
およびd2
が宣言されておらず、dynamic-attributes
要素がtrueに設定されています。
各属性は次の呼出しを使用して設定します。
setA( "1" ),
setDynamicAttribute( null, "d1", "2" ),
setDynamicAttribute( "http://www.foo.com/jsp/taglib/mytag.tld", "d2", "3" ),
setB( "4" ),
setDynamicAttribute( null, "d3", "5" ),および
setDynamicAttribute( "http://www.foo.com/jsp/taglib/mytag.tld", "d4", "6" ).
例3-1 動的な属性の例
<jsp:root xmlns:mytag="http://www.foo.com/jsp/taglib/mytag.tld" version="2.0"> <mytag:invokeDynamic a="1" d1="2" mytag:d2="3"> <jsp:attribute name="b">4</jsp:attribute> <jsp:attribute name="d3">5</jsp:attribute> <jsp:attribute name="mytag:d4">6</jsp:attribute> </mytag:invokeDynamic> </jsp:root>
タグにおいて動的な属性を受け付けると宣言するためには、DynamicAttributes
インタフェースが実装されている必要があります。構文は以下のとおりです。
public interface DynamicAttributes
また、動的な属性が受け付けられていることを示すために、TLDのタグのエントリを構成する必要があります。このタグのTLDで宣言されていない属性については、変換時にエラーを受け取るのではなく、その属性の名前と値で、setDynamicAttribute()
メソッドが呼び出されます。動的な属性の名前と値を記憶するようにタグを構成します。
setDynamicAttribute()
メソッドは、動的な属性を受け付けるように宣言されたタグが、TLDで宣言されていない属性を渡したときに、呼び出されます。構文は以下のとおりです。
public void setDynamicAttribute(java.lang.String uri, java.lang.String localName, java.lang.Object value)
パラメータ値は次のとおりです。
uri
- 属性のネームスペース、またはデフォルトのネームスペース内であればnull。
localName
- 設定されている属性の名前。
value
- 属性の値。
タグ・ハンドラが、所定の属性を受け付けないことを示す場合は、JspException
が送出されます。このタグに対して、コンテナはdoStartTag()
またはdoTag()
を呼び出すことはできません。
これらのインタフェースの詳細は、DynamicAttributes
API (http://docs.oracle.com/javaee/7/api/javax/servlet/jsp/tagext/DynamicAttributes.html
)を参照してください。