`

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自定义标签的相关概念、创建方法以及实际应用。 一、概述 1.1 使用简单标签机制 JSP自定义标签提供了类似HTML标签的语法结构,通过自定义标签,开发者可以封装复杂的Java代码,使得页面...

    JSP自定义标签动态属性支持

    首先,我们需要理解JSP自定义标签的基本结构。自定义标签通常由两部分组成:标签库描述符(TLD)和标签处理类。TLD文件定义了标签的名称、属性、行为等元数据,而标签处理类则实现了这些行为,处理由JSP页面传递过来的...

    创建JSP自定义标签.doc

    本篇将详细介绍如何创建JSP自定义标签。 首先,了解自定义标签的基本结构。一个自定义标签其实是一个Java类,这个类需要继承自`TagSupport`或`BodyTagSupport`。这两个类由JSP容器提供,它们包含处理JSP页面与...

    JSP自定义标签 例子

    本教程将深入探讨JSP自定义标签的概念、创建过程及其实际应用。 ### JSP自定义标签概念 JSP自定义标签是对标准JSP标签(如`&lt;jsp:include&gt;`或`&lt;c:forEach&gt;`)的扩展,它们提供了更高级别的抽象,允许开发者定义自己...

    JSP自定义标签JSP自定义标签

    综上所述,JSP自定义标签提供了一种强大的机制,使得JSP开发者能够创建定制的、可重用的代码片段,提升Web应用的开发效率和质量。通过理解和熟练运用自定义标签,开发者可以更好地组织和管理JSP项目,实现更高效的...

    jsp自定义嵌套标签

    ### jsp自定义嵌套标签:定义与使用详解 在JavaServer Pages(JSP)技术中,自定义标签是扩展其功能的一种强大手段。而自定义嵌套标签,则是在此基础上进一步提升灵活性和重用性的机制。本文将深入探讨自定义嵌套...

    JSP自定义标签-标签属性_动力节点Java学院整理

    以下是关于JSP自定义标签及其属性的相关知识点: 1. 自定义标签的必要性:在JSP中,原生的标签(如, , &lt;jsp:include&gt;, &lt;jsp:forward&gt; 等)对于许多常见的任务来说已经足够,但在需要高度可定制化的场景下,自定义...

    jsp自定义标签中的困扰

    通过深入学习JSP自定义标签的生命周期和`BodyTagSupport`类提供的方法,开发者能够更好地理解和解决问题,从而编写出高效、可靠的自定义标签。如果你在实现过程中遇到具体的错误或疑惑,可以参考`JSP自定义标签各...

    JSP自定义标签.ppt

    JSP自定义标签是JavaServer Pages(JSP)技术中的一种高级特性,它允许开发者创建可重用的、自定义的HTML元素,这些元素能够执行特定的Java代码逻辑,而无需在页面中直接嵌入Java代码。这极大地提高了JSP页面的...

    jsp自定义标签开发手册

    **JSP自定义标签开发手册** 在JavaServer Pages (JSP) 技术中,自定义标签是扩展JSP功能的重要手段,它允许开发者创建可重用、可封装的组件,提升代码的可读性和可维护性。本手册将深入探讨JSP自定义标签的开发流程...

    JSP自定义标签开发使用

    【JSP自定义标签开发使用】知识详解 JSP(JavaServer Pages)是一种动态网页技术,允许开发者在HTML页面中嵌入Java代码。在JSP中,自定义标签的使用可以增强代码的可读性和可维护性,使得复杂的业务逻辑更易于封装...

    jsp自定义标签库问答集锦.

    ### jsp自定义标签库知识点详解 #### 一、什么是jsp自定义标签? 1. **概念**:JSP 自定义标签是一种将复杂的功能封装成一个简单的标签的方式,它允许开发者创建可重用的代码组件,这些组件可以在 JSP 页面中像...

    jsp自定义标签介绍与操作实例.doc

    【jsp自定义标签介绍与操作实例】 在Java服务器页面(JSP)技术中,自定义标签允许开发者创建可重用的代码片段,提高代码的可维护性和可读性。自定义标签通过扩展JSP标准标签库(JSTL)的能力,使用户能够根据特定...

    jsp自定义迭代标签

    ### JSP自定义迭代标签详解 #### 一、引言 在JSP(JavaServer Pages)开发中,自定义标签可以极大地提高代码的复用性和可维护性。特别是在处理循环迭代逻辑时,自定义迭代标签能够使页面逻辑更加清晰、简洁。本文...

    JSP 自定义标签(清华IT)PPT (适用于有一定编程基础的人员)

    1. **编写标签处理器类**:这个类需要继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.BodyTagSupport`,并覆盖其中的特定方法,比如`doStartTag()`和`doEndTag()`,以实现自定义标签的...

    jsp自定义标签介绍与操作实例参考.pdf

    JSP自定义标签是JavaServer Pages(JSP)技术中的一种扩展机制,允许开发者创建可重用的自定义标签库,以提高代码的可读性和复用性。这些标签类似于HTML标签,但它们可以封装复杂的Java逻辑,提供更灵活的页面构建...

    jsp 自定义标签

    **JSP自定义标签**是JavaServer Pages(JSP)技术中的一个重要特性,它允许开发者扩展JSP语言,创建自己的可重用组件。通过自定义标签,开发人员可以编写更符合HTML语法、易于理解和维护的代码,同时隐藏复杂的Java...

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

    总的来说,这个项目结合了JSP自定义标签的创建、分页功能的实现以及当前位置的显示,涉及到了Web开发中的多个核心概念。通过这种方式,我们可以构建更加模块化、易于维护的JSP应用,提升开发效率。

Global site tag (gtag.js) - Google Analytics