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

简介:
实际意义: 就是在页面中从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,如需转载请自行联系原作者
相关文章
|
机器学习/深度学习 人工智能 边缘计算
AI技术在医学影像诊断中的应用
传统的医学影像诊断需要耗费大量时间和人力,而随着人工智能技术的发展,AI在医学影像诊断中的应用也日益广泛。本文将探讨AI技术在医学影像诊断中的应用现状和未来发展,以及其对医疗行业的深远影响。
662 28
【SPSS】生存-寿命表分析详细操作教程(附案例实战)
【SPSS】生存-寿命表分析详细操作教程(附案例实战)
1034 0
|
存储 Java 编译器
Go函数解密:底层工作原理
Go函数解密:底层工作原理
290 0
|
5月前
|
存储 弹性计算 运维
阿里云经济型e与通用算力型u1实例有何不同?性能、场景、价格对比与选型参考
在我们选择阿里云服务器实例规格时,经济型e实例和通用算力型u1实例因高性价比与广泛的适用性,深受个人开发者以及中小企业的喜爱。这两款实例不仅在价格上极具竞争力,而且在性能、稳定性以及适用场景方面也各有长处。它们之间究竟存在怎样的区别?在性能表现和适用场景上又有哪些不同?我们又该如何做出选择呢?本文会详细解读这两款实例的性能特点、适用场景、价格优势,以供大家参考。
|
存储 网络安全 数据处理
阿里云对象存储OSS计费模式按量付费和包年包月选择攻略
阿里云OSS对象存储计费模式分为按量付费和包年包月,默认开通OSS就是按量付费,购买资源包抵扣OSS费用的方式属于包年包月计费模式
3570 0
阿里云对象存储OSS计费模式按量付费和包年包月选择攻略
|
存储 数据可视化 数据挖掘
【数据可视化和BI技术】数据可视化和BI技术的原理、方法和工具,如Tableau、Power BI
【数据可视化和BI技术】数据可视化和BI技术的原理、方法和工具,如Tableau、Power BI
503 0
|
8月前
|
JSON 监控 物联网
WebSocket 调试全攻略:核心解析、工具选择与对比!
WebSocket 是一种全双工、实时交互的网络通信协议,适用于即时通信、实时数据流、多人协作、IoT 等场景。调试 WebSocket 时,工具应具备握手管理、实时消息收发、自定义 Header、消息大小告警、分组管理、多连接支持和断线重现等功能。主流调试工具如 Postman、ApiPost 和 ApiFox 各有优劣:Postman 界面友好适合基础调试;ApiPost 支持高级功能如消息分组和自动重连;ApiFox 则强化了多连接支持。选择工具时需根据具体需求和团队熟悉度决定。
|
安全 API 网络架构
Refit使用入门
本文介绍了如何使用Refit库在.NET Core项目中实现RESTful API的调用。通过创建`IGitHubApi`接口定义API方法,并在`Program.cs`中配置Refit客户端,最后在`WeatherForecastController`中演示了两种调用API的方式,展示了Refit的便捷性和类型安全性。
209 1
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 一文看懂人工智能、机器学习、深度学习是什么、有什么区别!
**摘要:** 了解AI、ML和DL的旅程。AI是模拟人类智能的科学,ML是其分支,让机器从数据中学习。DL是ML的深化,利用多层神经网络处理复杂数据。AI应用广泛,包括医疗诊断、金融服务、自动驾驶等。ML助力个性化推荐和疾病预测。DL推动计算机视觉和自然语言处理的进步。从基础到实践,这些技术正改变我们的生活。想要深入学习,可参考《人工智能:一种现代的方法》和《深度学习》。一起探索智能的乐趣!
524 1
算法金 | 一文看懂人工智能、机器学习、深度学习是什么、有什么区别!
|
缓存 Java 关系型数据库
maven篇1: 安装、设置和环境变量配置
maven篇1: 安装、设置和环境变量配置
600 2