您的位置:首页 > 其它

自定义标签

2016-08-16 09:46 113 查看


自定义标签(TagSupport )

定义最简单的标签    

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

Java代码

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代码  


<?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代码  

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 对标签体循环处理。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息