目次へ

10. タグの検証/スクリプト変数の定義

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属性が指定された場合は、値に「,」(カンマ)が含まれているかどうか検証する事。ただし値がスクリプトで指定された場合はその限りではない。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp