TagSupport クラス  
 
 
クラス名 :

javax.servlet.jsp.tagext.TagSupport

 
拡張するクラス :

なし

 
実装するクラス :

Tag, java.io.Serializable

 
実装先クラス :

内部コンテナ固有のクラス。ほとんどのコンテナは、このクラスの参照実装 (Apache Jakarta プロジェクトで作成) を使用します。

 
説明

TagSupport は、すべての Tag インターフェイスメソッドのデフォルト実装を提供するサポートクラスです。このクラスは、対応するカスタムアクション要素の body 要素にアクセスする必要がないタグハンドラのスーパークラスとして使用します。

 

単純なタグハンドラ (Tag インターフェイスを実装するのみ) として実装できるカスタムアクションの例には、HTTP 応答で Cookie を追加するアクションがあります。このアクション名を <ora:addCookie> とします。タグハンドラクラスの名前は com.ora.jsp.tags.generic.AddCookieTag で、TagSupport クラスを拡張して、Tag インターフェイスメソッド実装のほとんどを継承します。

package com.ora.jsp.tags.generic;

import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import com.ora.jsp.util.*;

public class AddCookieTag extends TagSupport {

<ora:addCookie> アクションには、name および value の 2 つの必須の属性と、maxAge の 1 つの省略可能な属性があります。各属性はインスタンス変数と標準のプロパティ設定メソッドで表されます。

    private String name;
    private String value;
    private String maxAgeString;

    public void setName(String name) {
        this.name = name;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public void setMaxAge(String maxAgeString) {
        this.maxAgeString = maxAgeString;
    }

すべての設定メソッドは対応するインスタンス変数を設定します。

カスタムアクションの目的は、属性で指定される namevalue、および maxAge 値で新しい javax.servlet.Cookie オブジェクトを作成し、応答に Cookie を追加することです。このタグハンドラクラスは、doEndTag() メソッドを上書きして次の処理を実行します。

    public int doEndTag() throws JspException {
        int maxAge = -1;
        if (maxAgeString != null) {
            try {
                maxAge = Integer.valueOf(maxAgeString).
                  intValue();
            }
            catch (NumberFormatException e) {
                throw new JspException("Invalid maxAge: " + 
                    e.getMessage());
            }
        }
        sendCookie(name, value, maxAge,
            (HttpServletResponse) pageContext.getResponse());
        return EVAL_PAGE;
    }

    private void sendCookie(String name, String value, 
      int maxAge,
        HttpServletResponse res) {
        Cookie cookie = new Cookie(name, value);
        cookie.setMaxAge(maxAge);
        res.addCookie(cookie);
    }

maxAge 属性は省略可能であるため、対応する String 値を int に変換する前に、この属性が設定されているかどうかを確認するためにテストが実行されます。name および value 属性では、このようなテストは不要です。これは、Web コンテナが、すべての必須の属性がカスタムアクションに設定されていることを確認するためです。必須の属性が設定されていない場合、Web コンテナはページの処理を拒否するので、必須の属性に対応する変数に値があることを常に確認できます。属性が必須かどうかは、ライブラリの TLD で指定されます。

また、タグハンドラクラスは、取得したオブジェクトへのすべての参照を解放するために、release() メソッドを実装する必要があります。

public void release() {
    name = null;
    value = null;
    maxAgeString = null;
    super.release();
}

タグハンドラが不要になったときは、release() メソッドが呼び出されます。AddCookieTag クラスはそのすべてのプロパティを null に設定し、super.release() を呼び出して、TagSupport クラスにも同じ処理を実行させます。これにより、すべてのプロパティオブジェクトがガベージコレクションで利用可能になります。

TagSupport メソッドはこの例には必要ありませんが、findAncestorWithClass() メソッドは他の状況で役立ちます。このメソッドは、親を検索するためにネストしたアクション要素のタグハンドラで使用できます。ネストしたタグハンドラは、親タグハンドラクラスで実装されているメソッドを呼び出して、親から情報を取得したり、親に情報を提供したりできます。たとえば、標準 JSP アクション要素の <jsp:forward> および <jsp:include> の本文内にネストされた <jsp:param> 要素を提供できます。ネストされたパラメータ要素の同等のカスタムアクションは、次のように findAncestorWithClass() メソッドを使用するタグハンドラで実装できます。

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class ParamTag extends TagSupport {
    private String name;
    private String value;

    public void setName(String name) {
        this.name = name;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public int doEndTag() throws JspException {
        Tag parent = findAncestorWithClass(this, 
          ParamParent.class);
        if (parent == null) {
            throw new JspException("The param action is not " +
                "enclosed by a supported action type");
        }
        ParamParent paramParent = (ParamParent) parent;
        paramParent.setParam(name, URLEncoder.
          encode(value));
        return EVAL_PAGE;
    }
}
TagSupport()  
public TagSupport()

指定された名前と値を使用して新しいインスタンスを作成します。

doEndTag()  
public int doEndTag() throws JspException

EVAL_PAGE を返します。

doStartTag()  
public int doStartTag() throws JspException

SKIP_BODY を返します。

findAncestorWithClass()  
public static final Tag findAncestorWithClass(Tag from, Class class)

指定された Tag インスタンスで始まるタグハンドラネスト構造 (ネストされたアクション要素に相当) で、それぞれの親の一致テストで見つかった、指定されたクラスのインスタンスを返します。見つからなかった場合は null を返します。

getId()  
public String getId()

id 属性値を返します。この値が設定されていない場合は null を返します。

getParent()  
public Tag getParent()

この Tag インスタンスに対応するアクション要素を含むアクション要素を表す、この Tag インスタンスの親を返します。インスタンスに親がない (JSP ページの最上位レベルである) 場合は null を返します。

getValue()  
public Object getValue(String k)

setValue() メソッドで設定された、指定された属性の値を返します。この値が見つからなかった場合は null を返します。

getValues()  
public java.util.Enumeration getValues()

setValue() メソッドで設定された値のすべての属性名の Enumeration を返します。

release()  
public void release()

このインスタンスによって保持されているすべてのオブジェクトへの参照を削除します。

removeValue()  
public void removeValue(String k)

setValue() メソッドで設定された値を削除します。

setPageContext()  
public void setPageContext(PageContext pageContext)

現在の PageContext への参照を保存します。

setId()  
public void setId(String id)

id 属性値を設定します。

setParent()  
public void setParent(Tag t)

このインスタンスの親への参照を保存します。

setValue()  
public void setValue(String k, Object o)

指定された属性を指定された値で保存します。サブクラスはこのメソッドを使用して、属性値をインスタンス変数の代わりとして保存できます。