开发迭代的标签:iterateTag

对于集合对象的Iterator类对象,在JSP的 Java代码中需要用while循环或for循环来输出,难于维护,且可复用性不好, 程序员总是在大量地做这样的工作,这时可以考虑用迭代的标签来开发,需要输出数据时只须在JSP页面中声明标签即可。

  开发迭代的标签,需要设计两个Java类:标签实现类和表示标签信息的类。本实例中标签实现类为iterateTag.java,表示标签信息的类为IterateTEI.java。开发迭代的标签可实现IterationTag接口,也可从TagSupport类或BodyTagSupport类继承,由于BodyTagSupport类继承自TagSupport类,而TagSupport类又实现了IterationTag接口,为简化开发,直接从BodyTagSupport类继承即可。

  (1)第一步:开发标签实现类和表示标签信息的类。
  iterateTag.java
  package body;
  import java.util.Collection;
  import java.util.Iterator;
  import javax.servlet.jsp.tagext.BodyTagSupport;
  public class iterateTag extends BodyTagSupport{
      private String name;//在pageContext中标识的一个属性名
      private Iterator it;//要迭代的对象
      private String type;//it中对象的类型
      public void setCollection(Collection collection){
          if(collection.size()>0)
              it=collection.iterator();
      }
   
      //----标签开始时调用此方法-------
    public int doStartTag(){
        if(it==null) return SKIP_BODY;
        else return continueNext(it);
    }
    //----标签体执行完后调用此方法----
    public int doAfterBody(){
        return continueNext(it);
    }
    //----标签结束时调用此方法-------
      public int doEndTag(){
          try{
              if(bodyContent!=null)
                bodyContent.writeOut(bodyContent.getEnclosingWriter());
         }catch(Exception e){
              System.out.println(e);
          }
          return EVAL_PAGE;
      } 
      //----迭代----
      protected int continueNext(Iterator it){
          if(it.hasNext()){
              pageContext.setAttribute(name,it.next(),pageContext.PAGE_SCOPE);
              return EVAL_BODY_TAG;
          }else return SKIP_BODY;
      }
      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;
      }
  }

  在标签实现类中,有3个属性:name、type和it。其中,name代表在pageContext中标识一个属性的名字;type代表待迭代内容的数据类型;it为要迭代的内容。在doStartTag()方法中,如果it不为null,就开始迭代,迭代时调用continueNext()方法。
  IterateTEI.java
  package body;
  import javax.servlet.jsp.tagext.TagData;
  import javax.servlet.jsp.tagext.TagExtraInfo;
  import javax.servlet.jsp.tagext.VariableInfo;
  //----提供标签翻译时的一些相关信息----
  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)             
            };
        }
    }
  VariableInfo类中有几个常量,具体的含义为:
  NESTED:标签中的参数在标签开始到标签结束之间是有效的。
  AT_BEGIN:标签中的参数在标签开始到使用它的JSP页面结束是有效的。
  AT_END:标签中的参数在标签的结束到使用它的JSP页面结束是有效的。

  (2)第二步:编写标签描述tld文件。本例在myTag.tld文件中增加内容。在<taglib>与</taglib>之间增加如下内容:
     <!-- iterateTag-->
      <tag>
      <!-- 标签名称-->
      <name>iterateTag</name>
      <!-- 标签对应的处理类-->
      <tag-class>body.iterateTag</tag-class>
      <tei-class>body.IterateTEI</tei-class>
      <!-- 标签体内容,有标签体则设为jsp-->
      <body-content>jsp</body-content>
      <!-- 标签的属性声明-->
      <attribute>
       <name>collection</name>
       <required>true</required>
       <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
       <name>name</name>
       <required>true</required>
      </attribute>
      <attribute>
       <name>type</name>
       <required>true</required>
      </attribute>
      </tag>
  </taglib>

  (3)第三步:在Web应用的web.xml文件中声明标签库引用。同样,本例与本章前面的实例使用同一个tld文件,因此不必再修改。

  (4)第四步:在JSP页面中声明并调用标签。
  <%@ taglib uri="/myTag" prefix="myTag" %>
  <%@ page contentType="text/html;charset=GB2312" %>
  <%@ page import="java.util.ArrayList"%>
    <head>
    <title>开发迭代的标签</title>
    </head>
    <body>
    开发一个迭代的标签,输出结果:<br>
    <%//----------设置一个ArrayList对象的初始值----------
   ArrayList testCol=new ArrayList();
   testCol.add("邓佳容");
   testCol.add("黄婧");
   testCol.add("邓子云");
   request.setAttribute("testCol",testCol);
    %>
    <myTag:iterateTag name="testColOne" collection="<%=testCol%>" type="String">
     输出一个值:<%=testColOne.toString()%><br>
    </myTag:iterateTag>
    </body>
  </html>

你可能感兴趣的:(开发迭代的标签:iterateTag)