Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

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

解答例はこちら



次のページへ TECHSCOREのTOPページへ 次のページへ
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa