`

JSP 自定义标签 BodyTagSupport

阅读更多
引用
带body的自定义标签,尝试写一个标签,这个标签可以迭代显示标签主体里面的内容,迭代的次数由标签的属性指定.
     首先,要说明的是,其实标签也是一个java类,它是运行一个或两个接口的javabean,然后再配合标签描述文件(以.tld为扩展名),两者结合就可以作出自己的自定义标签库了.呵呵,是不是觉得有点眉目了?
     那么下面我们开始写一个自己的java标签类,作为有body的标签,这个类必须实现javax.servlet.jsp.tagext.BodyTag接口.
下面我们看一下BodyTag这个接口中定义了那些方法来支持tag:


public void doInitBody();
public void setBodyContent(javax.servlet.jsp.tagext.BodyContent);
public int doAfterBody();

那么由于BodyTag继承了javax.servlet.jsp.tagext.Tag接口,所以我们再来看一下Tag中的方法:


public void release();
public javax.servlet.jsp.tagext.Tag getParent();
public void setParent(javax.servlet.jsp.tagext.Tag);
public int doEndTag();
public int doStartTag();
public void setPageContext(javax.servlet.jsp.PageContext);




引用
说了这么多方法,是不是有点头晕了?呵呵,那么究竟BodyTag的处理过程是怎么样的呢?下面我们就来说一下它的处理流程:
1.当容器创建一个新的标签实例后,通过setPageContext来设置标签的页面上下文.
2.使用setParent方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为null.
3.设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不调用此类方法.
4.调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY,当返回EVAL_BODY_INCLUDE时,就计算标签的body,如果返回SKIP_BODY,就不再计算标签的body.
5.调用setBodyContent设置当前的BodyContent.
6.调用doInitBody,如果计算BodyContent时需要进行一些初始化,就在这个方法中进行.
7.每次计算完Body后调用doAfterBody,如果返回EVAL_BODY_TAG,表示继续计算一次Body,直到返回SKIP_BODY才继续往下执行.
8.调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE,当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面其他的部分;如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面其他的部分.
9.调用release()方法释放标签程序占用的任何资源。
知道了标签处理的流程了,那么下面我们就开始写一个自己的java类了
我的标签类的源码:

package test.jsp.tags;

import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.JspTagException;

public class BodyTagExample extends BodyTagSupport {
    private int counts;

    public BodyTagExample() {
        super();
    }

    public void setCounts(int counts) {
        this.counts = counts;
    }

    public int doStartTag() throws JspTagException {
        System.out.println("doStartTag...");
        if (counts > 0) {
            return EVAL_BODY_TAG;
        } else {
            return SKIP_BODY;
        }
    }

    public void setBodyContent(BodyContent bodyContent) {
        System.out.println("setBodyContent...");
        this.bodyContent = bodyContent;
    }

    public void doInitBody() throws JspTagException {
        System.out.println("doInitBody....");
    }

    public int doAfterBody() throws JspTagException {
        System.out.println("do After body..." + counts);
        if (counts > 1) {
            counts--;
            return EVAL_BODY_TAG;
        } else {
            return SKIP_BODY;
        }
    }

    public int doEndTag() throws JspTagException {
        System.out.println("do end Tag...");
        try {
            if (bodyContent != null) {
                bodyContent.writeOut(bodyContent.getEnclosingWriter());
            }
        } catch (java.io.IOException e) {
            throw new JspTagException("IO Error: " + e.getMessage());
        }
        return EVAL_PAGE;
    }
}

写完了java类,下面我们该用一个描述文件来描述我们写的这个类了:
我的tld描述文件源码:


<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglibPUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN""http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>Application Tag Library</shortname>
<uri>http://jakarta.apache.org/taglibs/struts-example-1.0</uri>
<info>tag loop</info>
<tag>
<name>loop</name>
<tagclass>test.jsp.tags.BodyTagExample</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>counts</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>


我们对这个文件进行一个小小的说明:
引用
最重要的是上面的黑体字部分,其他的部分我们可以拷贝粘贴就可以了。
tag中的name属性:定义了我们的tag名称,在后面会用到。
tag中的tagclass属性:指定了我们这个tag的实现类。
tage中的bodycontent属性:指定我们的页面内容是什么性质的。(注意:在jsp开发中这里必须写JSP)
tage中的attribute属性:定义了我们的这个tag可能有的属性。
attribute中的name属性:指定了属性的名称。它和我们类中定义的“int counts;”必须一样,并且在类中还必须包含一个setCounts(int counts)方法,否则这个属性就不能设置。
attribute中的required属性:表示这个属性是否是必须的。
attribute中的rtexprvalue属性:表示这个属性是否可以用JSP的程序段的结果输出。
现在我们的tag就写完了,下面就是我们怎么在页面中用了。
首先,我们要在web.xml中声明这个tag
我的web.xml源码:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 
<web-app> 
<taglib> 
<taglib-uri>demotag</taglib-uri> 
<taglib-location>/WEB-INF/tld/mytag.tld</taglib-location> 
</taglib>
</web-app>

其次,我们要在页面中引用这个tag。
我的jsp源码:



<%@ page contentType="text/html; charset=GBK" language="java"%> 
<%@ taglib uri="demotag" prefix="demo" %> 
<html> 
<body> 
<br>
 <demo:loop counts="5"> 现在时间是:<%=new java.util.Date().toString()%>
<br> 
</demo:loop>
 <br>
 </body>
 </html>

好了,一个tag就开发完了,下面是页面的显示结果:
现在时间是:Thu Sep 22 12:33:31 CST 2005
现在时间是:Thu Sep 22 12:33:31 CST 2005
现在时间是:Thu Sep 22 12:33:31 CST 2005
现在时间是:Thu Sep 22 12:33:31 CST 2005
现在时间是:Thu Sep 22 12:33:31 CST 2005
这里是后台打出来的信息:
doStartTag...
setBodyContent...
doInitBody....
do After body...5
do After body...4
do After body...3
do After body...2
do After body...1
do end Tag...
一切OK了!

如果要写没有标签体的自定义标签,直接继承 TagSupport,实现doStartTag,doEndStart就可以了。
分享到:
评论
1 楼 fkpj_bit 2012-06-06  
不错,受用了

相关推荐

    jsp自定义标签中的困扰

    JSP自定义标签过程中会出现许多的问题,尤其是没有相应课题的专门书籍的时候.我在通过继承BodyTagSupport类来做标签的时候。出现了许多问题,我把这些问题归纳起来,希望能帮助到某些人。

    struts2自定义标签案例详解

    这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下...

    利用BodyTagSupport创建带标签体的自定义标签

    利用BodyTagSupport创建带标签体的自定义标签

    jsp java自定义标签 实现分页 当前位置标签

    通过BodyTagSupport实现了自定义的标签,主要实现功能为分页技术以及当前功能点所在位置。

    JSP自定义标签案例分析

    本文为大家介绍了JSP自定义标签的案例,供大家参考,具体内容如下 案例一:实现一个基本防盗链标签 1. 标签处理类 public class MyReferer extends BodyTagSupport { private String site; private String back; ...

    jsp通过自定义标签库实现数据列表显示的方法

    本文实例讲述了jsp通过自定义标签库实现数据列表显示的方法。分享给大家供大家参考,具体如下: 1. 定义标签库类 UserListTag.java package com.yanek.cms.tag; import java.io.IOException; import java.util....

    自定义标签

    通过extends BodyTagSupport实现自定义标签的代码实例;通过implements Tag实现自定义标签的代码实例

    在jsp中使用自定义taglib

    一个tag就是一个普通的java类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。而这两个类是由jsp容器提供的,无须开发...

    javax.servlet.jsp.tagext源码

    TagSupport SimpleTagSupport tagext javax servlet jsp Tag 标签

    JSP/Servlet

    BodyTagSupport 類別 自訂標籤屬性 自訂動態標籤屬性 SimpleTagSupport 類別(&lt;jsp:attribute&gt;) Scripting Variable Tag File Tag File是從JSP 2.0開始新增的功能,主要的目的是讓撰寫JSP網頁的網頁設計人...

    java web 视频、电子书、源码(李兴华老师出版)

    0312_JSP标签编程 0313_JSP标准标签库(JSTL) 0314_AJAX开发技术 0400_第四部分:框架开发 0415_Struts基础开发 0416_Struts常用标签库 0417_Struts高级开发 0500_第五部分:附录 0518_附录A:实用工具 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 ...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、...

    李兴华Java Web开发实战经典(高清版) Part2

    第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 ...

    可伪可不伪的分页标签

    import javax.servlet.jsp.tagext.BodyTagSupport; public class FenyeTag extends BodyTagSupport { private static final long serialVersionUID = 1L; private String html; private String exname; ...

Global site tag (gtag.js) - Google Analytics