7.2. javax.servlet.jsp.tagext.TagSupport
タグ・ハンドラクラスを作成する際、「Tag」「IterationTag」インタフェースを実装するのは面倒です。特に「setPageContext」や「setParent」はどのようなタグでもまず同じように実装されますので、できれば省略したいところです。JSPではこういった実装の負担を軽減するため、「javax.servlet.jsp.tagext.TagSupport」クラスが提供されています。「TagSupport」クラスは「IterationTag」インタフェースを実装したクラスで、何も行わないタグハンドクラスです。プログラマは必要なメソッドをオーバーライドして、独自のタグハンドラクラスを作成する事ができます。以下は5章の「HelloWorldTag」を「TagSupport」クラスを用いて作成しなおした例です。「Tag」インタフェースから作成するときと比べ、非常に簡単になっているのが解るかと思います。
import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import java.io.IOException; public class HelloWorldTag extends TagSupport{ public int doEndTag() throws JspException{ try{ pageContext.getOut().print("Hello World"); }catch(IOException e){ throw new JspException(e.getMessage()); } return EVAL_PAGE; } }
「TagSupport」が持つメソッドについて説明します。「doStartTag」「doEndTag」「doAfterBody」といったタグの挙動を決定するメソッドのデフォルトの動作については、以下の通りです。これらのメソッドをオーバーライドする事により、タグの挙動を変更する事になります。「HelloWorldTag」では「doEndTag」だけオーバーライドしています。
doStartTag() | SKIP_BODYを返す。ボディ部は評価されない。 |
doAfterBody() | SKIP_BODYを返す。ボディ部は再評価されない。 |
doEndTag() | EVAL_PAGEを返す。JSPページの残りの部分は評価されます。 |
「setParent」「getParent」「setPageContext」「release」メソッドの内容は、これまでのサンプルとほぼ同じです。これらの他に「TagSupport」クラスで独自に追加されているメソッドもあります。
setID(String) getID() |
タグの属性「ID」用の「set」「get」メソッド。 |
setValue(String,Object) |
タグにオブジェクトを関連付けたり、関連付けられたオブジェクトを取得するメソッド。 |
findAncestorWithClass(Tag,Class) | 親タグ(タグを囲んでいる上位のタグ)を検索するメソッド。 |
中でも「findAncestorWithClass」メソッドは、親子タグを作成する上で重要なメソッドです。親子タグの作成については後の章で説明します。
(実習課題4)
実習課題3のタグ・ハンドラクラスを改良しなさい。
- 「IterationTag」インタフェースではなく、「TagSupport」クラスから作成するようにする事。