10. タグの検証/スクリプト変数の定義
- 10.1. タグの検証
- 10.2. スクリプト変数の定義
- 10.3. TLDによるスクリプト変数の定義(JSP1.2)
10.1. タグの検証
カスタムタグがJSPページで正しく使用されているかどうか、検証する機能をJSPコンテナは提供しています。検証のもととなる基本的な情報はTLDに記載されており、例えば以下のような点の検証が行えます。これらの検証はJSPがサーブレットプログラムに変換される際に行われます。
- タグがボディ部を持つかどうか。ボディ部を持つ場合、JSPの規則に従うものかそうではないか。
- どのような属性を持つか、また属性に指定するそれぞれの値の型。
- どの属性が必須であるか。
しかし属性に関しては、これだけでは不十分な場合が考えられます。例として以下のような場面が挙げられます。
- 属性の組み合わせに制限がある場合。「属性AとBのいずれかが必須」、または「属性Aがtrueである場合、属性Cが必須」等。
- 属性の型だけでなく、値に制限がある場合。「整数でなければならない」等。
JSPはこれらを検証する機能を提供しています。特別な検証を行いたいカスタムタグに関して「javax.jsp.tagext.TagExtraInfo」のサブクラスを作成し、「isValid」メソッドをオーバーライドします。isValidメソッドの定義は以下の通りです。
boolean isValid(javax.jsp.tagext.TagData tagData);
引数のTagDataを用いて、タグの属性およびその値に関する情報を取得します。isValidメソッドは属性およびその値が正しい場合、trueを返すようにします。TagDataクラスに定義されているメソッドは以下の通りです。ここでは、通常は使用しないメソッドやコンストラクタは省略しています。
Object getAttribute(String attrName) |
引数に指定した属性の値を返す。 |
String getAttributeString(String attrName) |
引数に指定した属性の値を文字列で返す。 |
String getId() |
「id」属性の値を返す。「id」属性が定義されている場合のみ。 |
java.util.Enumeration getAttributes() |
属性名の一覧を返す。 |
次はTagExtraInfoクラスの例です。属性「name」または「collection」の何れかが定義されていることを検証します。
import javax.servlet.jsp.tagext.TagExtraInfo; import javax.servlet.jsp.tagext.TagData; public class SampleTagExtraInfo extends TagExtraInfo{ public boolean isValid(TagData tagData){ if(tagData.getAttribute("name")==null && tagData.getAttribute("collection")==null){ return(false); } return(true); } }
TagExtraInfoクラスを有効にするためには、TLDファイル内の該当タグに<tei-class>を定義します。<tei-class>は<tag-class>の次に定義します。以下はその例です。
... <tag> <name>sample</name> <tag-class>SampleTag</tag-class> <tei-class>SampleTagExtraInfo</tei-class> ... </tag> ...
これにより、TLDだけではできないような、カスタムタグの検証を行う事ができます。
しかしTagExtraInfoクラスによるカスタムタグの検証にも制約があります。この検証は、JSPファイルをサーブレットプログラムに変換する際に行われるので、属性の値がスクリプトで指定される、つまり実行時に値が決まるような場合には、属性の具体的な値について検証する事はできません。属性の値がスクリプトで指定されている場合には、TagDataのgetAttributeメソッドの返り値は、「TagData.REQUEST_TIME_VALUE」と決まっています。この制約は次に説明する、スクリプト変数の定義においても影響を及ぼしてきます。
(実習課題1)
次のカスタムタグおよびそれを検証するTagExtraInfoクラスを作成しなさい。またカスタムタグを利用したページを作成しなさい。
- HTTPリクエストまたは属性に指定された値から文字配列を作成し、指定の名前で指定のスコープに登録するカスタムタグ。
- request属性が指定された場合は、その属性値でHTTPリクエストから値を文字配列として取り出す。
- text属性が指定された場合は、その属性値を「,」(カンマ)で区切って文字配列を作成する。
- できた文字配列を、id属性で指定された名前で、scope属性で指定されたスコープに登録する事。
- またrequest属性かtext属性が必ず指定されるよう検証する事。またtext属性が指定された場合は、値に「,」(カンマ)が含まれているかどうか検証する事。ただし値がスクリプトで指定された場合はその限りではない。