自定义标签【迭代标签】

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


本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/282616,如需转载请自行联系原作者
相关文章
|
虚拟化 索引
看一下ARM的IP:SMMUU
看一下ARM的IP:SMMUU
620 1
|
存储 数据库 Android开发
|
存储 运维 监控
阿里云的文件存储NAS使用心得
阿里云的文件存储NAS使用心得
553 0
|
6月前
|
测试技术 持续交付 开发工具
《鸿蒙开发深度揭秘:应用版本管理与回滚策略》
在鸿蒙开发中,版本管理与回滚是保障应用稳定迭代和用户体验的关键环节。通过语义化版本控制(如“主版本号.次版本号.修订号”)、Git版本控制系统及CI/CD流程,开发者可高效管理代码变更、实现并行开发并确保版本清晰可追溯。当新版本出现问题时,回滚机制通过技术手段(如`git revert`或`git reset`)快速恢复至稳定状态。此外,完善的测试体系与灰度发布策略能降低回滚风险,而持续优化的版本管理方案则应对技术演进与生态变化带来的挑战。掌握这些核心技能,开发者可在鸿蒙生态中实现技术与商业双赢。
238 5
|
存储 文字识别 算法
基于飞桨实现项目2 中文场景文字识别
基于飞桨实现项目2 中文场景文字识别
401 0
基于飞桨实现项目2 中文场景文字识别
|
存储 数据库
哈夫曼编码的应用场景
哈夫曼编码的应用场景
310 0
|
弹性计算 安全 Linux
阿里云服务器安装宝塔面板图文教程
阿里云服务器安装宝塔面板图文教程,阿里云服务器网以CentOS操作系统为例,安装宝塔Linux面板,先远程连接到云服务器,然后执行宝塔面板安装命令,系统会自动安装宝塔面板,安装完成后会返回面板地址、账号和密码,然后在安全组开通宝塔面板端口号
711 0
|
前端开发 Java Serverless
玩转《天猫精灵技能平台》,搞一个诗词问答小游戏
看了中国诗词大会,必须要自己搞一个诗词问答小游戏。 文章最后还有一个思路,非常简单的思路,大家可以试着去实现一下。
14188 5
玩转《天猫精灵技能平台》,搞一个诗词问答小游戏
|
存储 弹性计算 分布式计算
阿里云服务器内存型r6、内存型r7实例有何区别?如何选择?
当我们通过阿里云活动去购买阿里云服务器的时候,如果我们计划购买的配置是2核16G、4核32G、8核64G这种vCPU之比为1:8的云服务器时会发现有内存型r6、内存型r7这两种实例规格可选,下面小编来为大家讲解它们之间到底有何区别。
564 0
阿里云服务器内存型r6、内存型r7实例有何区别?如何选择?
|
存储 NoSQL Java
【Docker】笔记小结
【Docker】笔记小结
1068 0
【Docker】笔记小结