- 浏览: 498038 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (250)
- concurrent (11)
- io (1)
- CI (10)
- linux (57)
- windows (2)
- java (38)
- mac (4)
- eclipse (9)
- db (13)
- python (5)
- groovy (5)
- flex (7)
- hibernate (5)
- odb (8)
- netbeans (1)
- web (31)
- book (14)
- erlang (2)
- communication (2)
- virtualization (5)
- jUnit (0)
- jsf (1)
- perl (1)
- java jax-rs (5)
- Jenkins (2)
- Jenkins Plugin (3)
- android (2)
- git (1)
- big data (0)
- 试读 (1)
最新评论
-
yzzy4793:
讲的很清楚,明白
同步synchronized方法和代码块 -
aa51513:
中文乱码式硬伤
Jersey2.x对REST请求处理流程的分析 -
feiwomoshu1991:
...
同步synchronized方法和代码块 -
marshan:
启动失败的原因是加载的类版本冲突,因此你首先要保证依赖的版本和 ...
richfaces中facelet版本升级到2时的典型错误和解决办法 -
zhaohang6688:
请问我按照你的方式修改还是报错 错误信息还是这个 是为什么啊 ...
richfaces中facelet版本升级到2时的典型错误和解决办法
2005-10-19 12: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
发表评论
-
Apache benchmarking
2013-11-17 16:15 1207NAME ab - Apache HTTP ser ... -
dojo 动态创建下拉菜单和输入框
2013-02-04 18:35 5988<!DOCTYPE HTML PUBLIC " ... -
动态加载css和java script
2013-01-24 18:53 2687var portalLoader = { dojo : ... -
[web architect] nginx1.2.6+ tomcat7+memcached1.2.6
2012-12-25 17:40 1329Load Balancer (Nginx) ... -
[web architect] tomcat+nginx单机
2012-12-24 18:39 994location / { ... -
Tomcat管理配置
2011-04-10 00:49 1217<?xml version='1.0' encod ... -
当前浏览器对html5的支持[狠图]
2011-01-15 03:08 4506html5是web的未来,这部巨作尚未完成,现在闪现的还只是一 ... -
richfaces中facelet版本升级到2时的典型错误和解决办法
2010-08-31 10:23 60092010-8-31 9:48:35 com.sun.faces ... -
探讨JSF·RichFaces分页的一种策略
2010-03-22 17:06 2807richfaces提供的rich:dataTable和rich ... -
checkbox与dataTable的完美结合
2010-02-23 17:43 11265本文介绍了richface的一种使用情况:datatable和 ... -
richface 皮肤
2010-01-07 13:36 1505一、绪 richface默认提供 ... -
RichFaces第一例
2009-12-29 14:30 1668学习JSF和RichFaces一周了,总结以一个小例子为介,分 ... -
大小写问题
2008-10-14 16:11 1248背景: 系统包括单点登录模块,存在多个数据库,有mysql和o ... -
九张图
2004-12-02 13:52 1196这些天一直在做查询页面。昨天碰到了这个:美工提供的在页面上显示 ... -
翻页的处理
2004-12-28 10:11 10841 翻页时排序:为了实 ... -
上传file前,判断上传文件的扩展名
2004-12-28 10:20 1647首先我不太确定Js能否扑捉到file的value,于是作了一个 ... -
上传文件前判空
2004-12-28 10:24 1265上传文件时如果下拉列表框或file框为空,会报错。下面就解决这 ... -
根据radio值动态显示file
2005-03-01 17:51 1270<html><head><met ... -
jsp/servlet 乱码解决小方法
2005-03-13 15:13 1333import java.io.UnsupportedEncod ... -
关于unconditional
2005-03-18 23:18 933在active状态调用destroyApp(boolean u ...
相关推荐
在项目`zjut`中,我们可以创建一个简单的自定义标签,例如显示当前时间。首先编写`CurrentTimeTag.java`处理器类,然后在TLD文件中定义该标签,最后在JSP页面上使用。运行项目,自定义标签将在页面上显示实时时间。 ...
通过以上步骤,我们能够创建一个简单的自定义标签`<myTags:defineTag>`,并将其应用于JSP页面中。自定义标签使得JSP开发更加模块化,提高了代码的可读性和可维护性,降低了维护复杂性的不良影响。因此,掌握自定义...
在这个例子中,`Demo1_JspTag`项目包含了一个简单的自定义标签实现,通过`myTag`标签,我们可以看到如何将Java代码与JSP页面分离,提高代码的复用性和可维护性。这只是一个基础示例,实际上自定义标签可以处理更复杂...
### 原创-制作一个带参数的自定义标签 #### 深入解析与实践指南 在Web开发中,自定义标签库是提升代码复用性和可维护性的重要手段,尤其是在JavaServer Pages (JSP)环境中。本文将基于一篇技术笔记——《自定义...
一个“自定义标签”是开发者为了扩展JSP(JavaServer Pages)功能而创建的,它允许我们封装复杂逻辑并将其作为可重用的组件。本项目提供了一个用于分页的自定义标签,适用于那些需要在网页上进行数据分页展示的应用...
本篇内容主要介绍了一个简单的分页标签的实现过程,这是一个很好的学习实践,帮助开发者理解和掌握自定义标签的编写与应用。 首先,我们要理解自定义标签的生命周期和组成部分。一个完整的自定义标签通常包含以下...
本文将深入探讨一个简单的JSP自定义标签,这是一项提高代码可重用性和组织性的关键技能。 自定义标签是JSP中的一个重要特性,它允许我们创建自己的标签库,以更直观、易读的方式来表达业务逻辑或复杂的功能。这些...
`Tag`接口的直接子接口`IterationTag`是用于开发迭代标签的,如`for-each`,并且有一个默认实现类`TagSupport`。另一个子接口`BodyTag`允许标签包含内容体,`BodyTagSupport`是它的实现类,适用于需要处理内容体的...
- 每个TLD文件可以包含多个自定义标签的声明,例如`<tag>`元素定义了一个新的标签,`<tag-class>`指定处理类,`<body-content>`指定标签是否可以包含内容。 5. **开发流程** - 编写标签处理类:实现`Tag`或`...
在开发过程中,有一些工具可以帮助简化自定义标签的开发,如Apache's Taglibs和MyFaces Tomahawk等,它们提供了丰富的预定义标签,可以极大地提高开发效率。 综上所述,JSP自定义标签是Java Web开发中提升代码质量...
在Java Web开发中,自定义Tag标签是一种常用的技术,它允许开发者创建可重用的代码块,提升开发效率,同时使代码结构更加清晰。Struts2框架提供了强大的自定义标签支持,结合国际化全局资源配置,可以实现多语言环境...
1. **定义TLD文件**:在开始开发自定义标签之前,你需要创建一个TLD文件,定义标签的名称、属性、标签处理类等。例如: ```xml <tag> <name>myTag <tag-class>com.example.MyTagHandler</tag-class> <body-...
这个“一个类似foreach的简单自定义标签”是一个示例,它实现了与JSTL(JavaServer Pages Standard Tag Library)中的`<c:forEach>`标签类似的功能,用于遍历集合数据并进行渲染。 自定义标签的核心在于TLD(Tag ...
自定义标签是JSP(JavaServer Pages)技术中非常重要的一个概念,它允许开发者通过简化的方式来编写可复用的代码段,从而增强JSP页面的可读性和可维护性。本篇文章将深入讲解自定义标签的使用、实现原理以及开发过程...
例如,我们可以创建一个显示用户信息的标签`DisplayUserInfoTag`。 3. 配置标签库:在项目的`struts.xml`配置文件中,我们需要声明自定义标签库,包括标签库的名称、前缀和标签实现类。 二、创建标签描述符 1. ...
例如,一个简单的TLD可能如下所示: ```xml <tlib-version>1.0 <jsp-version>2.0 <short-name>myTagLib <uri>http://example.com/myTagLib</uri> <tag> <name>myTag <tag-class>...
在这个实例中,我们探讨的是一个简单的“Hello World”自定义标签的实现,这对于初学者理解自定义标签的工作原理非常有帮助。 首先,我们要了解自定义标签的组成部分。一个完整的自定义标签通常包括以下部分: 1. ...
接下来,我们将在Eclipse中创建一个简单的自定义标签示例。首先,创建一个新的动态Web项目,然后通过Lomboz的"New > JSP Tag Library"向导创建标签库。向导会生成一个默认的TLD文件,我们需要在这个文件中定义我们的...
本篇文章将带你回顾如何实现一个简单的自定义标签。 一、自定义标签的基本概念 自定义标签是JSP标准标签库(JSTL)的扩展,它们通常由两个部分组成:标签处理类(Tag Handler Class)和标签库描述文件(TLD,Tag ...