自定义标签(TagSupport )

定义最简单的标签   
自定义标签采用Default Adapter模式(缺省适配模式) 

Java代码

 //最简单的标签     
 public class LangHuaTag extends TagSupport {     
     private long startTime;     
     private long endTime;     
          
     public int doStartTag() throws JspException {     
         startTime = System.currentTimeMillis();     
         //表示定制标记里面有所包括的JSP页面     
         return TagSupport.EVAL_BODY_INCLUDE;     
     }     
     public int doEndTag() throws JspException {     
         endTime = System.currentTimeMillis();     
         long elapsed = endTime - startTime;          
         try {     
             JspWriter out = pageContext.getOut();     
             out.println("runtime is "+ elapsed);     
         } catch (IOException e) {     
             e.printStackTrace();     
         }     
         //表示JSP页面继续运行     
         return TagSupport.EVAL_PAGE;     
     }     
          
 }     
 //代属性的标签     
 public class DateTag extends TagSupport {     
     private String pattern = "yyyy-MM-dd hh:mm:ss";     
     private Date date;     
     //必须要有Set方法,因为是属性可以设值     
     public void setPattern(String pattern) {     
         this.pattern = pattern;     
     }     
          
     public void setDate(Date date) {     
         this.date = date;     
     }     
     
     public int doEndTag() throws JspException {     
         SimpleDateFormat sdf = new SimpleDateFormat(pattern);     
         //如果没有就是当前时间     
         if(date==null){     
             date = new Date();     
         }            
         JspWriter out = pageContext.getOut();     
         try {     
             out.print(sdf.format(date));     
         } catch (IOException e) {     
             e.printStackTrace();     
         }     
         return TagSupport.EVAL_PAGE;     
     }     
 }     
     
 /**   
  * 循环输出   
  * @author Administrator   
  *   
  */    
 public class LoopTag extends TagSupport {     
     private int times =0;     
     //Set方法设值     
     public void setTimes(int times) {     
         this.times = times;     
     }     
          
     public int doStartTag() throws JspException {     
         //表示定制标记里面有所包括的JSP页面     
         return TagSupport.EVAL_BODY_INCLUDE;     
     }     
          
     public int doAfterBody() throws JspException {     
         if(times>0){     
             times--;     
             //表示双从标签开始输入     
             return TagSupport.EVAL_BODY_AGAIN;     
         }        
         //表示结束,忽略标签内部的内容     
         return TagSupport.SKIP_BODY;     
     }     
          
 }    

配置文件   
Xml代码

 <?xml version="1.0" encoding="UTF-8" ?>    
 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"    
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"    
     version="2.0">    
     <tlib-version>1.0</tlib-version>    
     <short-name>util</short-name>    
     <uri>http://langhua.com/taglib/util</uri>    
     <tag>    
         <name>timer</name>    
         <tag-class>com.langhua.tagsupport.LangHuaTag</tag-class>    
         <body-content>JSP</body-content>    
         <!-- JSP,empty表示能能包函内容的,scriptless,tagdependent -->    
     </tag>    
          
     <tag>    
         <name>date</name>    
         <tag-class>com.langhua.tagsupport.DateTag</tag-class>    
         <body-content>empty</body-content>           
         <!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->    
         <attribute>    
             <!-- 标签名 -->    
             <name>time</name>    
             <!-- 是否为可选属性 -->    
             <required>false</required>    
             <!-- 是否接受JSP表达示计算结果 -->    
             <rtexprvalue>true</rtexprvalue>    
         </attribute>    
         <attribute>    
             <name>pattern</name>    
             <required>true</required>    
             <rtexprvalue>false</rtexprvalue>    
         </attribute>    
     </tag>    
          
     <tag>    
         <name>loop</name>    
         <tag-class>com.langhua.tagsupport.LoopTag</tag-class>    
         <body-content>JSP</body-content>             
         <!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->    
         <attribute>    
             <!-- 标签名 -->    
             <name>times</name>    
             <!-- 是否为可选属性 -->    
             <required>true</required>    
             <!-- 是否接受JSP表达示计算结果 -->    
             <rtexprvalue>true</rtexprvalue>    
         </attribute>           
     </tag>    
 </taglib>    

 

JSP页面   
Html代码  

 <%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>    
     
 <util:timer></util:timer>    
 <util:loop times="3">    
     <util:date pattern="yyyy-MM-dd" /><br/>    
 </util:loop>    
   
 <%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>  
   
 <util:timer></util:timer>  
 <util:loop times="3">  
     <util:date pattern="yyyy-MM-dd" /><br/>  
 </util:loop>

 

TagSupport的流程图

          SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。
      
        SKIP_PAGE 忽略标签后面的JSP内容。
      
      EVAL_PAGE 处理标签后,继续处理JSP后面的内容。
      
      EVAL_BODY_BUFFERED 表示需要处理标签体。
      
      EVAL_BODY_INCLUDE 表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法
      
      EVAL_BODY_AGAIN 对标签体循环处理。

      自定义标签(TagSupport )_第1张图片

      你可能感兴趣的:(apache,xml,Web,jsp,sun)