如果我們要開發出這樣的標籤,一般需要二個開發類,一具類實現BodyTagSupport介面,另一個類擴充套件TagExtraInfo類。TagExtraInfo旨在提供標籤執行時的資訊。
 
IterateTag.java
package com.randy.tag;

import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class IterateTag extends BodyTagSupport {

  private String name;// 一個屬性名
  private Iterator it;//要迭代的物件
  private String type ;//it中物件的型別
    
  public void setCollection(Collection collection){
    it =collection.iterator();
  }
    
  @Override
  public int doEndTag() throws JspException {
        try {
          if(bodyContent != null){
          bodyContent.writeOut(bodyContent.getEnclosingWriter());
          }
        } catch (IOException e) {
          e.printStackTrace();

        }
    return    EVAL_PAGE;
  }

  @Override
  public int doStartTag() throws JspException {

    if(it == null){
      return SKIP_BODY;
        
    }else{
      return continueNext();
    }
  }

  private int continueNext() {
    if(it.hasNext()){
      pageContext.setAttribute(name, it.next(),pageContext.PAGE_SCOPE);
      return EVAL_BODY_TAG;
    }else{
        
      return SKIP_BODY;
    }
  }
@Override
  public int doAfterBody(){    
    return continueNext();
  }

public String getName() {
  return name;
}

public void setName(String name) {
  this.name = name;
}

public String getType() {
  return type;
}

public void setType(String type) {
  this.type = type;
}
    
}

 
由於BodyTagSupport類實現了IteratorTag介面,所以在開發迭代標籤時,可以直接從BodyTagSupport類繼承,IterateTag就是從BodyTagSupport類繼承的例子。在IterateTag中,有3個屬性,它們是name,type和it。name代表了在pageContext中標識的一個屬性的名字;type代表了待迭代的內容的型別;it代表了要迭代的內容。在IterateTag中必須提供這些屬性的setter方法,並且在JSP中使用這些屬性時必須提供對應的值。
在doStartTag方法中,如果it不為null,那麼就進行第一次迭代。在continueNext方法中如果it還有下一個,那麼就繼續迭代,如果沒有下一個了,就返回SKIP_BODY,表示不再迭代。
除了上面的標籤類外,還需要開發一個表示標籤資訊的類,如下
IterateTEI.java
package com.randy.tag;

import javax.servlet.jsp.tagext.*;
//TagExtraInfo用於提供一些在標籤翻譯時相關的資訊。
public class IterateTEI extends TagExtraInfo
{
    public IterateTEI()
    {
            super();
    }
    
    public VariableInfo[] getVariableInfo(TagData data)
    {
            return new VariableInfo[]
            {
                    new VariableInfo(
                            data.getAttributeString(“name”),
                            data.getAttributeString(“type”),
                            true,
                            VariableInfo.NESTED
                    ),
            };
    }
}

Part 8 TagExtraInfo 和 VariableInfo
這兩個類結合使用的目的是,在標籤外部獲取標籤處理類中儲存在頁面的物件。該物件如果是JavaBean,則可以直接用<jsp:getProperty name=”id” property=”xxx”>取得該javabean的屬性值,id是所儲存的頁面物件對應的變數名。標籤外部包括:<prefix:mytag>開始到Page結束的範圍,</prefix:mytag>開始到Page結束的範圍,<prefix:mytag>和</prefix:mytag>中間的範圍。
TagExtraInfo類最重要的一個方法是
public VariableInfo[] <wbr>getVariableInfo<wbr>(TagData data)
功能是返回所有的與此TagExtraInfo相關聯的標籤定義類裡的變數資訊。
VariableInfo類的建構函式
public <wbr>VariableInfo<wbr>(String ID,String ClassName,Boolean Declare, int Scope)<wbr>
ID表示變數名稱
ClassName表示類的名稱
Declare表示之前是否申明過
Scope表示變數的使用範圍:VariableInfo.AT_BEGIN表示從標籤起始位置到Page結束,VariableInfo.AT_END表示標籤結束位置到Page結束,VariableInfo.NESTED表示標籤起止中間的範圍。
 
 
使用:
<%
List list = new ArrayList();
list.add(“天龍八部”);
list.add(“神鵰俠侶”);
list.add(“射鵰英雄傳”);

request.setAttribute(“list”,list);
%>

<myTag:iterateTag name=“book” type=“String” collection=“<%=list%>”>
  <%=book.toString() %>
</myTag:iterateTag>