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」と同様
メソッドを実装しなければなりません。その内容は同じですので、ここでは省略しています。 「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」属性にはスクリプトでオブジェクトの配列を指定する。
- 指定されたオブジェクトの配列を、順にリスト表示する。