天天看点

自定义标签【迭代标签】

如果我们要开发出这样的标签,一般需要二个开发类,一具类实现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>

继续阅读