分享
 
 
 

一个简单的带Body的自定义Tag开发过程

王朝other·作者佚名  2006-02-20
窄屏简体版  字體: |||超大  

2005-10-1912:08:34

JasonDong2005-09-28

今天学习带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 taglib

PUBLIC "-//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-INFtldmytag.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了!

程序很简单,但是希望以此来向大家展示一个tag的基本开发流程,如果有不对的地方,希望大家批评指正!谢谢!

http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=37680

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有