天天看點

自定義标簽【疊代标簽】

如果我們要開發出這樣的标簽,一般需要二個開發類,一具類實作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;

  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;

@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

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[] getVariableInfo(TagData data)

功能是傳回所有的與此TagExtraInfo相關聯的标簽定義類裡的變量資訊。

VariableInfo類的構造函數

public VariableInfo(String ID,String ClassName,Boolean Declare, int Scope)

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>

繼續閱讀