目次へ

7. 繰り返し機能を持つカスタムタグ

7.1. javax.servlet.jsp.tagext.IterationTag

ボディ部を繰り返し実行する機能を持つタグを作成するためには、「IterationTag」を使用してタグハンドラクラスを作成する必要があります。以下はその例です。このタグは、属性「list」で指定された名前で登録されている「java.util.List」を検索し、その要素を順に属性「item」で指定された名前で「pageContext」に登録する処理を行います。

...
public class ListTag implements IterationTag{
  private PageContext pageContext=null;
  private Tag parent=null;
  private Iterator iterator=null;
  private String item="";
  ...
  public void setList(String name){
    List list=(List)pageContext.findAttribute(name);
    this.iterator=list.iterator();
  }

  public void setItem(String item){
    this.item=item;
  }

  public int doStartTag() throws JspException{
    if(iterator.hasNext()){
      pageContext.setAttribute(item,iterator.next());
      return(EVAL_BODY_INCLUDE);
    }else{
      return(SKIP_BODY);
    }
  }

  public int doAfterBody() throws JspException{
    if(iterator.hasNext()){
      pageContext.setAttribute(item,iterator.next());
      return(EVAL_BODY_AGAIN);
    }else{
      return(SKIP_BODY);
    }
  }

  public int doEndTag() throws JspException{
    return(EVAL_PAGE);
  }
  ...
}
タグのライフサイクルの図

「Iteration」タグにおいても「Tag」と同様

  • setPageContext
  • setParent
  • getParent
  • release

メソッドを実装しなければなりません。その内容は同じですので、ここでは省略しています。

「setList」「setItem」は属性の値をセットするメソッドです。「setList」メソッドで「List」オブジェクトを検索し、「Iterator」インタフェースをインスタンス変数に設定しています。

そして「doStartTag」「doAfterBody」で、「Iterator」インタフェースを操作しています。「doAfterBody」は「IterationTag」で追加されたメソッドで、ボディ部の評価が終了した後に呼び出されます。右図にもある通り、「EVAL_BODY_AGAIN」を返した場合にはボディ部の再評価が行われ、「SKIP_BODY」が返された場合には「doEndTag」メソッドが呼び出されます。

ここでは「Iterator」がまだ要素を読み込める状態にあるとき、要素を「pageContext」に設定して「EVAL_BODY_AGAIN」を返しています。また最初にボディ部を実行するときのために「doStartTag」でも同様の処理が必要になる点に注意してください。

以下は上記のカスタムタグ(「List」タグ)を利用したJSPページの例です。「List」タグのボディ部で、「pageContext」から要素を取り出し、表示を行っています。

<%@ page contentType="text/html; charset=EUC-JP" import="java.util.*" %>
<%@ taglib uri="http://www.techscore.com/tags/example" prefix="example" %>
...
<% List list=new LinkedList();
   list.add(new String("test1"));
   list.add(new String("test2"));
   application.setAttribute("list",list); %>
<example:List list="list" item="item">
<%=pageContext.getAttribute("item") %>
</example:List>
...

(実習課題1)

7.1.のサンプルカスタムタグ「ListTag」を実装し、それを使用したJSPページを作成しなさい。

解答例はこちら

(実習課題2)

7.1.のサンプルカスタムタグ「ListTag」を以下の点で改良し、それを使用したJSPページを作成しなさい。

  • 「list」属性で指定されたオブジェクトが「java.util.List」ではなく、「java.util.Map」であった場合、その値を順に「pageContext」に登録するようにする事。

解答例はこちら

(実習課題3)

以下のサンプルカスタムタグを実装し、それを使用したJSPページを作成しなさい。

  • 「array」属性にはスクリプトでオブジェクトの配列を指定する。
  • 指定されたオブジェクトの配列を、順にリスト表示する。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp