目次へ

5.2. 「ボディ部を持たない」カスタムタグのハンドラクラスの作成

この節では「ボディ部を持たない」最も単純なカスタムタグのハンドラクラス作成方法について説明します。ハンドラクラスの作成方法には幾つか種類がありますが、最も基本的な方法は「javax.servlet.jsp.tagext.Tag」インタフェースを実装するものです。ここではこの方法を利用します。

以下は指定すると「Hello World」と表示するタグのハンドラクラスです。以下を用いて説明します。

 import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.tagext.Tag;
 import java.io.IOException;

 public class HelloWorldTag implements Tag{
   private PageContext pageContext=null;
   private Tag parentTag=null;

  public void setPageContext(PageContext pageContext){
    this.pageContext=pageContext;
  }

  public void setParent(Tag parentTag){
    this.parentTag=parentTag;
  }

  public int doStartTag() throws JspException{
    return SKIP_BODY;
  }

  public int doEndTag() throws JspException{
    try{
      pageContext.getOut().print("Hello World");
    }catch(IOException e){
      throw new JspException(e.getMessage());
    }
    return EVAL_PAGE;
  }

  public void release(){}

  public Tag getParent(){
    return parentTag;
  }
}

「Tag」インタフェースで定義されているメソッドは幾つかあり、それぞれの意味は以下の通りです。

setPageContext(PageContext) JSPページで使用する様々なリソース・データ等を管理する「javax.servlet.jsp.PageContext」を設定する。
setParent(Tag) タグを囲んでいる親タグを設定する。
doStartTag()

タグの開始時に呼び出されるメソッド。

<myTag:date>...</myTag:date>

とすると、最初の<myTag:date>の際に呼び出されるメソッドと考えれば良い。返り値はタグのボディ部を評価して実行するかどうかを指定する。「Tag.EVAL_BODY_INCLUDE」の場合は評価、「Tag.SKIP_BODY」の場合は評価しない。

doEndTag() タグの終了時に呼び出されるメソッド。タグが閉じられるときに呼び出されると考えれば良い。返り値はタグの後に続くJSPページを評価して実行するかどうかを指定する。「Tag.EVAL_PAGE」の場合は評価、「Tag.SKIP_PAGE」の場合は評価しない。
release() タグで設定されたリソースを開放する。
getParent() タグを囲んでいる親タグを返す。

「setPageContext」「setParent」「getParent」「release」については、まず特別な事をする事はありませんのでサンプルのようにして下さい。タグ固有の処理については、「doStartTag」「doEndTag」内に書き込みます。

「doStartTag」では「Tag.SKIP_BODY」を返すだけの処理しかしていません(19行目)。つまりタグのボディ部は評価しない事を指定しています。

「doEndTag」で「Hello World」の出力処理を行っています。JSPページへの出力は、「PageContext」の「getOut」メソッドで取り出される「javax.servlet.jsp.JspWriter」インスタンスを利用して行います(24行目)。このクラスは「java.io.PrintWriter」とほぼ同じメソッドを提供していますので、サーブレットでの出力処理と同じように行う事ができるかと思います。また「doEndTag」では「javax.jsp.JspException」しかスローできませんので、その他の例外が発生した場合にはJspExceptionにラッピングする(26行目)などの工夫が必要になります。

サンプルでは「Hello World」の出力処理を「doEndTag」内で行っていますが、「doStartTag」内で行っても構いません。ボディ部が無いので、どちらで行っても違いは出ないからです。

(実習課題1)

以下のカスタムタグのハンドラクラスを実装しなさい。

  • 今日の日付を表示する。フォーマットは任意。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp