`
sirong_chan
  • 浏览: 11462 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

struts自定义标签开发

 
阅读更多

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

publicvoid doInitBody();
publicvoid setBodyContent(javax.servlet.jsp.tagext.BodyContent);
publicint doAfterBody();

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

 

publicvoid release();
public javax.servlet.jsp.tagext.Tag getParent();
publicvoid setParent(javax.servlet.jsp.tagext.Tag);
publicint doEndTag();
publicint doStartTag();
publicvoid 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;

publicclass BodyTagExample extends BodyTagSupport
{
privateint counts;

public BodyTagExample()
{
super();
}
publicvoid setCounts(int counts)
{
this.counts = counts;
}
publicint doStartTag() throws JspTagException
{
System.out.println(
"doStartTag...");
if (counts >0)
{
return EVAL_BODY_TAG;
}
else
{
return SKIP_BODY;
}
}
publicvoid setBodyContent(BodyContent bodyContent)
{
System.out.println(
"setBodyContent...");
this.bodyContent = bodyContent;
}
publicvoid doInitBody() throws JspTagException
{
System.out.println(
"doInitBody....");
}
publicint doAfterBody() throws JspTagException
{
System.out.println(
"do After body..."+ counts);
if (counts >1)
{
counts
--;
return EVAL_BODY_TAG;
}
else
{
return SKIP_BODY;
}
}
publicint doEndTag() throws JspTagException
{
System.out.println(
"do end Tag...");
try
{
if (bodyContent !=null)
{
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
}
catch (java.io.IOException e)
{
thrownew 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-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>
复制代码
 
如果要写没有标签体的自定义标签,直接继承 TagSupport,实现doStartTag,doEndStart就可以了。
 
 
 
分享到:
评论

相关推荐

    struts1自定义标签

    自定义标签,直接代码,直接模仿开发即可 public class ButtonTag extends AttributeTag { //tld中定义的属性 public String label; public String url; public String click; public String confirm; public ...

    struts2自定义标签案例详解

    其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。这里在实现自定义标签时,继承的2个类分别是org.apache....

    struts2自定义标签

    struts2自定义标签 用户自定义标签 在J2EE项目中,JSP页面常常通过在静态页面模板中嵌入scriptlets来插入动态的内容。然而,随着复杂程序的增加,JSP页面也变得难于管理。 虽然用这种方法开发小形项目唾手可得,但是...

    自定义标签+struts2标签控制访问链接权限.zip

    资料内容为教程,介绍taglib_原理和实现;JSP自定义标签;JSP页面中自定义标签详解教程;java自定义标签开发;角色标签库;自定义标签帮助文档;自定义标签其它重要资料。

    Struts2 自定义标签

    附件是一个简单的自定义标签,提供给大家参考,例子很简单,希望对大家有帮助,基于eclipse 开发

    struts2标签库

    从JSP1.1规范后,JSP增加了自定义标签库的支持。标签库是一种组件技术,通过标签库,可以将复杂的Java脚本代码封装在组件中,开发者只需要使用简单的代码就可以实现复杂的Java脚本功能。提供了Java脚本的复用性,...

    Struts2自定义分页标签

    最近在学习Struts2,并使用Struts2开发系统。在网上看了好多的struts2的分页,虽然都实现了分页的功能,但是感觉不是非常好,需要我们在每次写分页的时候做很多的工作,而我认为分页应该是一个通用的组件,开发人员...

    JspTld自定义标签

    JspTld自定义标签在项目开发过程中经常遇见,我自己做了一个小例子,希望大家能够看看

    在struts2的freemarker模板中扩展struts标签

    众所周知,struts2宣称freemarker模板中不再支持自定义标签,但如果工程UI仅用freemarker模板可以通过扩展struts标签简单实现,不是采用官方不推荐的配置JspSupportServlet实现的!内付详细说明及范例,此方法仅为团队...

    struts标签库运用

    从JSP1.1规范后,JSP增加了自定义标签库的支持。标签库是一种组件技术,通过标签库,可以将复杂的Java脚本代码封装在组件中,开发者只需要使用简单的代码就可以实现复杂的Java脚本功能。提供了Java脚本的复用性,...

    Struts网络编程例学与实践 源码

    第8-11章是Struts比较高级的内容,包括Struts自定义标签、Struts校验机制、Struts国际化方法和Struts的Tickes组件;第12章是一个完整实例,结合Eclipse、Ant等内容,搭建了一个真实的开发环境和实际的应用。 本书在...

    java 自定义标签

    利用 自定义标签,软件开发人员和页面设计人员可以独立地自由工作.页面设计人员可以把精力集中在使用标签(HTML,XML或者JSP)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面,若国际化等等,这样,页面...

    jsp自定义标签实例

    这是本人自己写的,里面包括传参与不传参的标签,很方便,步骤很详细。所有就上传上来了。

    Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)

    第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内容,也包括Struts 2.x中的内容;第5篇为Hibernate框架...

    struts2分页代码的示例

    在开发web程序时,从数据库中取出来的数据一般都要分页显示在页面上,分页显示的方法非常多,有人写自定义标签,用自己写的标签进行分页显示,我个人觉得这是一种比较好的方法。下面是我用Struts2做的一个分页显示...

    struts2讲义_吴峻申

    5.7 Struts2自定义标签实现图形验证功能 121 第6章 Struts2非JSP视图技术 125 6.1 velocity视图技术使用介绍 125 6.2 freemarker视图技术使用介绍 128 6.3 JasperReports报表视图技术使用介绍 130 第7章 Struts2类型...

    spring2.5 struts2.0 hibernate3.2.5 搭建的企业级开发基础模块

    哦 忘记介绍了, 当中还有本人写的几个自定义标签:com.light.framework.tag 自定义标签的帮助类:com.light.framework.tagAssistant 还有登录拦截器:com.light.framework.interceptor 字符集过滤器:...

    Hibernate+Struts 无限级树形菜单(MSSQL).rar

    2、主要实现技术:Struts1.2+Hibernate3.0+JavaScript+JSTL1.1+自定义标签 3、页面的树形菜单的节点用 JavaScript进行控制 4、数据库中的商品类别表productCategory包含一个引用自身主键的外键,从而形成自身一对...

    Struts2 in action中文版

    8.1.1 页面上:如何使用自定义结果组件构建Struts 2 Ajax应用程序 171 8.1.2 实现JSON结果类型 173 8.2 常用的结果类型 180 8.2.1 RequestDispatcher,也叫做dispatcher 180 8.2.2 ServletRedirectResult,也叫做...

    Jsp宝典 PDF

    JSP宝典PDF电子版下载,JSP宝典全书比较全面地介绍了有关JSP的相关知识,并通过大量实例,循序渐进地教会读者如何构架和开发JSP动态网站、自定义标签开发和标准标签库JSTL使用、以及Ajax等Web2.0新特性。在教程的...

Global site tag (gtag.js) - Google Analytics