当前位置: 首页 > news >正文

自定义标签【包含标签体】

实际意义: 就是在页面中从3开始,循环输出 时间
 
package com.randy.tag; 

import java.io.IOException; 

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

public  class BodyTag  extends BodyTagSupport { 

    
   private  int countNum =0; //循环显示时间的次数 
   private  int currentNum =1; //当前执行次数 
    
  @Override 
   public  int doAfterBody()  throws JspException { 


     try { 
      JspWriter out = pageContext.getOut(); 
      out.println( "第"+currentNum+ "次执行标签体。标签体执行完毕。<br/>"); 
        
       if(countNum >1){ 
        countNum--; 
        currentNum ++; 
         return EVAL_BODY_TAG; 
      } else
         return SKIP_BODY; 
      } 
    }  catch (IOException e) { 
      e.printStackTrace(); 
       return SKIP_BODY; 
    } 
  } 

  @Override 
   public  int doEndTag()  throws JspException { 
     
     try { 
      JspWriter out = pageContext.getOut(); 
      bodyContent.writeOut(bodyContent.getEnclosingWriter()); //输出标签体的内容 
      out.println( "标签结束了"); 
    }  catch (IOException e) { 
      e.printStackTrace(); 
    } 
     return EVAL_PAGE; 
  } 

  @Override 
   public  void doInitBody()  throws JspException { 

    currentNum=3; 
     super.doInitBody(); 
  } 

  @Override 
   public  int doStartTag()  throws JspException { 
       try { 
        JspWriter out = pageContext.getOut(); 
        out.println( "标签开始了:<br/>"); 
         
         if(countNum>0){ 
           return EVAL_BODY_TAG; 
        } else
           return SKIP_BODY; 
        } 
      }  catch (IOException e) { 
        e.printStackTrace(); 
         return SKIP_BODY; 
      } 
     
  } 

   public  int getCountNum() { 
     return countNum; 
  } 

   public  void setCountNum( int countNum) { 
     this.countNum = countNum; 
     this.currentNum =1; 
  } 

    
    

 
 
tld
  <tag> 
    <description>含有标签体</description> 
    <name>bodyTag</name> 
    <tag- class>com.randy.tag.BodyTag</tag- class
    <body-content>JSP</body-content> 
     
    <attribute> 
      <name>countNum</name> 
      <required> true</required> 
      <rtexprvalue> true</rtexprvalue> 
    </attribute> 
  </tag>
 
注意JSP 的大写。 书上写的是小写,不对。
 
<myTag:bodyTag countNum= "6"
  <%=  new java.util.Date() %> 
</myTag:bodyTag>


本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/282615,如需转载请自行联系原作者

相关文章:

  • JQuery Hello World及注意事项
  • MySQL 高可用:mysql+mycat实现数据库分片(分库分表)
  • 用FlashFXP上传文件到SSH服务器,附FlashFXP显示中文乱码的解决方法
  • Ansible-playbook 之 loops 循环一
  • 按大小拆分超大文件的方法(本文测试了一个62G的文件)
  • Ansible源码解析Inventory动态inventory脚本解析script.py
  • 《Java 学习笔记》 第九章阅读体验
  • pyCharm远程连接服务器
  • android应用程序跳转到系统的各个设置页面
  • Jboss问题总结 - 1
  • [转]三维成像原理
  • hdu 1671(字典树)
  • ![CDATA[ ]] 是什么东东
  • 什么是web接口
  • ubuntu下usb转串口设置
  • android 一些 utils
  • C++11: atomic 头文件
  • Gradle 5.0 正式版发布
  • java中的hashCode
  • JS字符串转数字方法总结
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue官网教程学习过程中值得记录的一些事情
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 回顾 Swift 多平台移植进度 #2
  • 理清楚Vue的结构
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何编写一个可升级的智能合约
  • 使用agvtool更改app version/build
  • 事件委托的小应用
  • 数据可视化之 Sankey 桑基图的实现
  • 数组的操作
  • 用jQuery怎么做到前后端分离
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #QT(TCP网络编程-服务端)
  • (C语言)共用体union的用法举例
  • (js)循环条件满足时终止循环
  • (阿里云万网)-域名注册购买实名流程
  • (分布式缓存)Redis哨兵
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (南京观海微电子)——I3C协议介绍
  • (转)C#调用WebService 基础
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • **python多态
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 简单实现MD5
  • .NET 设计一套高性能的弱事件机制
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ Linux Audio 篇 ] 音频开发入门基础知识