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」属性にはスクリプトでオブジェクトの配列を指定する。
- 指定されたオブジェクトの配列を、順にリスト表示する。


